2017-08-25 3 views
2
In [88]: c 
Out[88]: 
         Address Name 
CustomerID        
10   Address for Mike Mike 
11   Address for Marcia Marcia 

In [89]: c.index 
Out[89]: Int64Index([10, 11], dtype='int64', name='CustomerID') 

In [90]: orders 
Out[90]: 
    CustomerID OrderDate 
0   10 2014-12-01 
1   11 2014-12-01 
2   10 2014-12-01 

In [91]: orders.index 
Out[91]: RangeIndex(start=0, stop=3, step=1) 

In [92]: c.merge(orders) 
--------------------------- 
MergeError: No common columns to perform merge on 

So kann Panda nicht zusammenführen, wenn Index Spalte in einer Datenrahmen den gleichen Namen wie eine andere Spalte in einem zweiten Datenrahmen hat?Pandas auf Index-Spalte zusammenführen?

Antwort

7

Sie müssen explizit angeben, wie die Tabelle zu verbinden. Standardmäßig wählt merge den allgemeinen Spaltennamen als Zusammenführungsschlüssel. Für Ihren Fall

c.merge(orders, left_index=True, right_on='CustomID') 

Lesen Sie auch die Dokumentation von pandas.DataFrame.merge bitte. Ich hoffe, das wäre hilfreich.

+0

thx, lese ich gerade verschiedene Bücher, eine Menge Informationen :) danke Rojeer! – DmitrySemenov

1

Versuchen Sie, den Index Zurücksetzen:

c.reset_index().merge(orders) 
2

Die join Methode ist eine linke standardmäßig join (how='left') und schließt sich an den Indizes der Datenrahmen. Eingestellt, so den Index des orders Datenrahmen zu CustomerId und kommen dann.

# Create sample data. 
orders = pd.DataFrame(
    {'CustomerID': [10, 11, 10], 
    'OrderDate': ['2014-12-01', '2014-12-01', '2014-12-01']})  
c = pd.DataFrame(
    {'Address': ['Address for Mike', 'Address for Marcia'], 
    'Name': ['Mike', 'Marcia']}, 
    index=pd.Index([10, 11], dtype='int64', name='CustomerID')) 

# Join. 
>>> c.join(orders.set_index('CustomerID')) 
         Address Name OrderDate 
CustomerID           
10   Address for Mike Mike 2014-12-01 
10   Address for Mike Mike 2014-12-01 
11   Address for Marcia Marcia 2014-12-01 

Alternativ kann diese merge wird Geben Sie das gleiche Ergebnis an: Hier fügen Sie den Index c (linker Datenrahmen) und die Spalte CustomerID im rechten Datenbereich hinzu Stellen Sie sicher, dass how='left' nur Elemente aus dem rechten Datenrahmen mit allen Datensätzen auf der rechten Seite verknüpft links (eine äquivalente Anzahl von Zeilen entsprechend der l von c). Das Standardverhalten für merge ist ein innerer Join, wobei das Ergebnis nur die Datensätze aus c enthält, die eine Übereinstimmung in orders finden (obwohl dies Ihr gewünschtes Ergebnis sein könnte).

c.merge(orders, left_index=True, right_on='CustomerID', how='left') 
Verwandte Themen