webentwicklung-frage-antwort-db.com.de

Führen Sie zwei Datenrahmen nach Index zusammen

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 verstehe, dass merge(), d. H. df1.merge(df2) Spalten verwendet, um den Abgleich durchzuführen. Tatsächlich 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, einen 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

104
brucezepplin

Verwenden Sie merge , das standardmäßig der innere Join ist:

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

Oder join , das standardmäßig beitreten bleibt:

df1.join(df2)

Oder concat , wobei es sich standardmäßig um einen Outer Join handelt:

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
209
jezrael

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

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

oder Zusammenführen zum Verketten durch benutzerdefinierte Felder/Indizes:

# 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 join für einen Indexbeitritt:

 df1.join(df2)
21
MaxU

Wenn Sie zwei Datenrahmen in pandas verbinden möchten, können Sie einfach verfügbare Attribute wie merge oder concatenate verwenden. Wenn ich zum Beispiel zwei Datenrahmen df1 und df2 habe, kann ich sie folgendermaßen verbinden:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
2
vignesh babu

Ein dummer Bug, der mich erwischt hat: Die Joins sind fehlgeschlagen, weil sich die Index-D-Typen unterschieden. Dies war nicht offensichtlich, da beide Tabellen Pivot-Tabellen derselben Orginal-Tabelle waren. Nach reset_index sahen die Indizes in jupyter identisch aus. Es kam nur zum Vorschein, als es in Excel gespeichert wurde ...

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

Hoffentlich spart das jemand eine Stunde!

2
Stephen Morrell

standardmäßig:
join ist ein spaltenweiser linker Join
pd.merge ist 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 (verwenden Sie [df, df2]).
Die Abmessungen des DataFrames sollten entlang der Achse übereinstimmen

Join und pd.merge:
kann DataFrame-Argumente annehmen

0
vicpal