Scalanie dwóch ramek danych według indeksu
Witam mam następujące dataframes:
> 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
Jak połączyć indeksy, aby uzyskać:
id begin conditional confidence discoveryTechnique concept
0 278 56 false 0.0 1 A
1 421 18 false 0.0 1 B
Pytam, ponieważ z mojego zrozumienia wynika, że merge()
tzn. df1.merge(df2)
używa kolumn do matching.In fakt robiąc to dostaję:
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
Czy łączenie się z indeksem jest złą praktyką? Czy to niemożliwe? Jeśli tak, to czy mogę przenieść indeks do nowej kolumny o nazwie "indeks"?
Dzięki
4 answers
Użycie merge
, które domyślnie jest połączeniem wewnętrznym:
pd.merge(df1, df2, left_index=True, right_index=True)
Lub join
, który jest domyślnie dołączony:
df1.join(df2)
Lub concat
, który domyślnie jest połączeniem zewnętrznym:
pd.concat([df1, df2], axis=1)
Próbki :
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 12:26:47
Możesz użyć concat ([DF1, DF2, ...], axis=1) w celu połączenia dwóch lub więcej DFs wyrównanych indeksami:
pd.concat([df1, df2, df3, ...], axis=1)
Lub merge do łączenia przez niestandardowe pola / indeksy:
# 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)
Lub Dołącz do łączenia przez indeks:
df1.join(df2)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-07 17:44:05
Jeśli chcesz połączyć dwa ramki danych w pandy, możesz użyć po prostu dostępnych atrybutów, takich jak merge
lub conacenate
.
Na przykład, jeśli mam dwa dataframes df1
i df2
mogę dołączyć do nich następnie przez:
newdataframe=merge(df1,df2,left_index=True,right_index=True)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-25 09:29:44
Głupi błąd, który mnie dopadł: joins nie powiodło się, ponieważ indeks dtypy się różniły. Nie było to oczywiste, ponieważ oba stoły były obrotowymi stołami tego samego oryginalnego stołu. Po reset_index indeksy wyglądały identycznie w jupyterze. Wyszło na jaw tylko przy zapisywaniu do Excela...
Fixed with: df1[['key']] = df1[['key']].apply(pd.to_numeric)
Miejmy nadzieję, że to zaoszczędzi komuś godzinę!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-27 11:02:23