Cześć, mam następujące ramki danych:
> 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ż rozumiem, że merge()
np. df1.merge(df2)
Używa kolumn do dopasowania. W rzeczywistości robiąc to, otrzymuję:
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ę w indeksie jest złą praktyką? Czy to niemożliwe? Jeśli tak, jak mogę przenieść indeks do nowej kolumny o nazwie „indeks”?
Dzięki
df1.join(df2)
Odpowiedzi:
Użyj
merge
, co jest domyślnie złączeniem wewnętrznym:Lub
join
, który domyślnie pozostaje dołączony:Lub
concat
, co jest domyślnie złączeniem zewnętrznym:Próbki :
źródło
.transpose()
jednego z twoich plików df, aby zsynchronizować indeksy - to był mój problemconcat
trzeba umieścić df w nawiasach podczas,join
amerge
nie?dfs = [df1, df2, df3,... dfn]
i potemdf = pd. concat(dfs)
możesz użyć concat ([df1, df2, ...], axis = 1) , aby połączyć dwa lub więcej DF wyrównane indeksami:
lub scal w celu łączenia przez niestandardowe pola / indeksy:
lub dołącz, aby dołączyć według indeksu:
źródło
Domyślnie:
join
to złączenie lewostronne względempd.merge
kolumnpd.concat
to złączenie wewnętrzne zgodne z kolumnami jest złączeniem zewnętrznym względem wierszypd.concat
:pobiera iterowalne argumenty. W związku z tym nie może bezpośrednio pobierać DataFrame (użyj
[df,df2]
).Wymiary DataFrame powinny być zgodne wzdłuż osi
Join
andpd.merge
:może przyjmować argumenty DataFrame
źródło
Głupi błąd, który mnie dopadł: łączenia nie powiodły się, ponieważ indeks się
dtypes
różnił. Nie było to oczywiste, ponieważ obie tabele były tabelami przestawnymi tej samej oryginalnej tabeli. Późniejreset_index
indeksy wyglądały identycznie w Jupyter. Wyszło na jaw dopiero podczas zapisywania do Excela ...Naprawiono za pomocą:
df1[['key']] = df1[['key']].apply(pd.to_numeric)
Miejmy nadzieję, że to zaoszczędzi komuś godzinę!
źródło
Jeśli chcesz połączyć dwie ramki danych w pandach, możesz po prostu użyć dostępnych atrybutów, takich jak
merge
lubconcatenate
. Na przykład, jeśli mam dwie ramki danychdf1
idf2
mogę do nich dołączyć:źródło