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
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
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)
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)
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!
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