Führen Sie zwei Datenrahmen nach Index zusammen


160

Hallo, ich habe die folgenden Datenrahmen:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

Wie füge ich die Indizes zusammen, um Folgendes zu erhalten:

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

Ich frage, weil ich es verstehe, merge()dh df1.merge(df2)Spalten verwendet, um den Abgleich durchzuführen. In der Tat bekomme ich dabei:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

Ist es eine schlechte Praxis, auf Index zusammenzuführen? Es ist unmöglich? Wenn ja, wie kann ich den Index in eine neue Spalte mit dem Namen "index" verschieben?

Vielen Dank


3
Versuchen Sie dies:df1.join(df2)
MaxU

Was ist, wenn Sie durch den Index eines Datenrahmens und eine Spalte des zweiten Datenrahmens verbinden möchten? (Mein zweiter Datenrahmen hat eine Spalte, die mit den Indeces im ersten df
übereinstimmt

Antworten:


320

Verwenden Sie mergestandardmäßig den inneren Join:

pd.merge(df1, df2, left_index=True, right_index=True)

Oder join, was standardmäßig verbunden bleibt:

df1.join(df2)

Oder concat, was standardmäßig Outer Join ist:

pd.concat([df1, df2], axis=1)

Beispiele :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
nett. Wenn andere dies lesen und es nicht funktioniert, .transpose()prüfen Sie, ob Sie eines Ihrer dfs benötigen, um die Indizes zu synchronisieren - das war mein Problem
Jona

2
Vielen Dank. Gute Antwort. Aber warum muss concatdf währenddessen in Klammern gesetzt werden joinund mergenicht?
Bowen Liu

@ Bowen Liu Meiner Meinung nach für mögliche concat mehrere DataFrames in Liste wie dfs = [df1, df2, df3,... dfn]und danndf = pd. concat(dfs)
jezrael

@jezrael Könnten Sie bitte meine neue Frage unter stackoverflow.com/questions/57133848/…
Msquare

28

Sie können concat ([df1, df2, ...], axis = 1) verwenden, um zwei oder mehr DFs zu verketten, die durch Indizes ausgerichtet sind:

pd.concat([df1, df2, df3, ...], axis=1)

oder fusionieren durch benutzerdefinierte Felder / Indizes für verketten:

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

oder beitreten, um sich nach Index anzumelden:

 df1.join(df2)

6

Standardmäßig:
joinist eine spaltenweise linke Verknüpfung
pd.mergeist eine spaltenweise innere Verknüpfung
pd.concat ist eine zeilenweise äußere Verknüpfung

pd.concat:
nimmt Iterable Argumente. Daher kann DataFrames nicht direkt verwendet werden (Verwendung [df,df2])
Abmessungen von DataFrame sollten entlang der Achse übereinstimmen

Joinund pd.merge:
können DataFrame-Argumente annehmen


5

Ein dummer Fehler, der mich erwischt hat: Die Verknüpfungen sind fehlgeschlagen, weil der Index dtypesunterschiedlich war. Dies war nicht offensichtlich, da beide Tabellen Pivot-Tabellen derselben Originaltabelle waren. Nach demreset_index sahen die Indizes in Jupyter identisch aus. Es kam erst beim Speichern in Excel zum Vorschein ...

Behoben mit: df1[['key']] = df1[['key']].apply(pd.to_numeric)

Hoffentlich spart das jemandem eine Stunde!


4

Wenn Sie zwei Datenrahmen in Pandas verbinden möchten, können Sie einfach verfügbare Attribute wie mergeoder verwenden concatenate. Zum Beispiel, wenn ich zwei Datenrahmen habe df1und df2sie verbinden kann durch:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.