pandas
Scalanie, łączenie i łączenie
Szukaj…
Składnia
Ramka danych. merge ( right, how = 'inner', on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = False, przyrostki = ('_ x', '_y'), copy = True, wskaźnik = Fałsz )
Scal obiekty DataFrame, wykonując operację łączenia w stylu bazy danych za pomocą kolumn lub indeksów.
W przypadku łączenia kolumn w kolumnach indeksy DataFrame zostaną zignorowane. W przeciwnym razie, jeśli łączymy indeksy z indeksami lub indeksy w kolumnie lub kolumnach, indeks zostanie przekazany.
Parametry
Parametry | Wyjaśnienie |
---|---|
dobrze | Ramka danych |
w jaki sposób | {„lewy”, „prawy”, „zewnętrzny”, „wewnętrzny”}, domyślny „wewnętrzny” |
left_on | etykieta lub lista lub tablicowe. Nazwy pól do przyłączenia w lewej ramce danych. Może być wektorem lub listą wektorów o długości DataFrame, aby użyć określonego wektora jako klucza łączenia zamiast kolumn |
tak jest | etykieta lub lista lub tablicowe. Nazwy pól, do których należy dołączyć w prawej ramce danych lub wektorze / liście wektorów w dokumentach left_on |
left_index | boolean, domyślnie False. Użyj indeksu z lewej DataFrame jako klucza (kluczy) łączenia. Jeśli jest to MultiIndex, liczba kluczy w drugiej ramce danych (indeks lub liczba kolumn) musi być zgodna z liczbą poziomów |
prawy_indeks | boolean, domyślnie False. Użyj indeksu z prawej DataFrame jako klucza przyłączenia. Te same zastrzeżenia, co left_index |
sortować | boolean, domyślny Fals. Posortuj klucze łączenia leksykograficznie w wynikowej ramce danych |
sufiksy | Sekwencja 2 długości (krotka, lista, ...). Sufiks stosowany do nakładających się nazw kolumn odpowiednio po lewej i prawej stronie |
Kopiuj | wartość logiczna, domyślnie Prawda. Jeśli Fałsz, nie kopiuj niepotrzebnie danych |
wskaźnik | boolean lub string, domyślnie False. Jeśli ma wartość True, dodaje kolumnę do wyjścia DataFrame o nazwie „_merge” z informacją o źródle każdego wiersza. Jeśli ciąg, kolumna z informacją o źródle każdego wiersza zostanie dodana do wyjściowej ramki DataFrame, a kolumna otrzyma nazwę wartości ciągu. Kolumna informacyjna ma charakter kategoryczny i przyjmuje wartość „left_only” w przypadku obserwacji, których klucz scalający pojawia się tylko w „lewej” ramce danych, „right_only” w przypadku obserwacji, której klucz scalający występuje tylko w „prawej” ramce danych, i „obie”, jeśli klucz scalający obserwacji znajduje się w obu. |
Łączyć
Na przykład podane są dwie tabele,
T1
id x y
8 42 1.9
9 30 1.9
T2
id signal
8 55
8 56
8 59
9 57
9 58
9 60
Celem jest zdobycie nowej tabeli T3:
id x y s1 s2 s3
8 42 1.9 55 56 58
9 30 1.9 57 58 60
Który ma tworzyć kolumny s1
, s2
i s3
, każda odpowiadająca wierszowi (liczba wierszy na id
jest zawsze stała i równa 3)
Przez zastosowanie join
(który przyjmuje opcjonalny argument argumentu, który może być nazwą kolumny lub wielu kolumn, co określa, że przekazana DataFrame ma być wyrównana do tej kolumny w DataFrame). Tak więc rozwiązanie może wyglądać tak, jak pokazano poniżej:
df = df1.merge (df2.groupby ('id') ['signal']. Apply (lambda x: x.reset_index (drop = True)). unstack (). reset_index ())
df
Out[63]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
Jeśli je rozdzielę:
df2t = df2.groupby('id')['signal'].apply(lambda x: x.reset_index(drop=True)).unstack().reset_index()
df2t
Out[59]:
id 0 1 2
0 8 55 56 59
1 9 57 58 60
df = df1.merge(df2t)
df
Out[61]:
id x y 0 1 2
0 8 42 1.9 55 56 59
1 9 30 1.9 57 58 60
Scalenie dwóch ramek danych
In [1]: df1 = pd.DataFrame({'x': [1, 2, 3], 'y': ['a', 'b', 'c']})
In [2]: df2 = pd.DataFrame({'y': ['b', 'c', 'd'], 'z': [4, 5, 6]})
In [3]: df1
Out[3]:
x y
0 1 a
1 2 b
2 3 c
In [4]: df2
Out[4]:
y z
0 b 4
1 c 5
2 d 6
Przyłączenie wewnętrzne:
Używa przecięcia kluczy z dwóch ramek danych.
In [5]: df1.merge(df2) # by default, it does an inner join on the common column(s)
Out[5]:
x y z
0 2 b 4
1 3 c 5
Alternatywnie określ przecięcie kluczy z dwóch ramek danych.
In [5]: merged_inner = pd.merge(left=df1, right=df2, left_on='y', right_on='y')
Out[5]:
x y z
0 2 b 4
1 3 c 5
Przyłączenie zewnętrzne:
Wykorzystuje połączenie kluczy z dwóch DataFrames.
In [6]: df1.merge(df2, how='outer')
Out[6]:
x y z
0 1.0 a NaN
1 2.0 b 4.0
2 3.0 c 5.0
3 NaN d 6.0
Lewe dołączenie:
Używa tylko kluczy z lewej DataFrame.
In [7]: df1.merge(df2, how='left')
Out[7]:
x y z
0 1 a NaN
1 2 b 4.0
2 3 c 5.0
Right Join
Używa tylko kluczy z właściwej DataFrame.
In [8]: df1.merge(df2, how='right')
Out[8]:
x y z
0 2.0 b 4
1 3.0 c 5
2 NaN d 6
Scalanie / łączenie / łączenie wielu ramek danych (poziomo i pionowo)
generuj przykładowe ramki danych:
In [57]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [58]: df1 = pd.DataFrame({'col1':[11,12,13], 'col2': [21,22,23]})
In [59]: df2 = pd.DataFrame({'col1':[111,112,113], 'col2': [121,122,123]})
In [60]: df3 = pd.DataFrame({'col1':[211,212,213], 'col2': [221,222,223]})
In [61]: df1
Out[61]:
col1 col2
0 11 21
1 12 22
2 13 23
In [62]: df2
Out[62]:
col1 col2
0 111 121
1 112 122
2 113 123
In [63]: df3
Out[63]:
col1 col2
0 211 221
1 212 222
2 213 223
scal / połącz / konkatenuj ramki danych [df1, df2, df3] pionowo - dodaj wiersze
In [64]: pd.concat([df1,df2,df3], ignore_index=True)
Out[64]:
col1 col2
0 11 21
1 12 22
2 13 23
3 111 121
4 112 122
5 113 123
6 211 221
7 212 222
8 213 223
scal / połącz / konkatenuj ramki danych poziomo (wyrównanie według indeksu):
In [65]: pd.concat([df1,df2,df3], axis=1)
Out[65]:
col1 col2 col1 col2 col1 col2
0 11 21 111 121 211 221
1 12 22 112 122 212 222
2 13 23 113 123 213 223
Scal, dołącz i konkatuj
Scalanie nazw kluczy jest takie samo
pd.merge(df1, df2, on='key')
Scalanie nazw kluczy jest różne
pd.merge(df1, df2, left_on='l_key', right_on='r_key')
Różne rodzaje łączenia
pd.merge(df1, df2, on='key', how='left')
Scalanie na wielu klawiszach
pd.merge(df1, df2, on=['key1', 'key2'])
Leczenie nakładających się kolumn
pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
Używanie indeksu wierszy zamiast scalania kluczy
pd.merge(df1, df2, right_index=True, left_index=True)
Unikaj stosowania składni .join
ponieważ daje to wyjątek dla nakładających się kolumn
Scalanie lewego indeksu ramki danych i prawej kolumny ramki danych
pd.merge(df1, df2, right_index=True, left_on='l_key')
Concate dataframes
Klejone pionowo
pd.concat([df1, df2, df3], axis=0)
Klejone poziomo
pd.concat([df1, df2, df3], axis=1)
Jaka jest różnica między łączeniem a łączeniem
Rozważ ramki danych w left
i w right
left = pd.DataFrame([['a', 1], ['b', 2]], list('XY'), list('AB'))
left
A B
X a 1
Y b 2
right = pd.DataFrame([['a', 3], ['b', 4]], list('XY'), list('AC'))
right
A C
X a 3
Y b 4
join
Pomyśl o join
jako o połączeniu z ramkami danych na podstawie ich odpowiednich indeksów. Jeśli występują nakładające się kolumny, join
będzie wymagać dodania sufiksu do nakładającej się nazwy kolumny z lewej ramki danych. Nasze dwie ramki danych mają nakładającą się nazwę kolumny A
left.join(right, lsuffix='_')
A_ B A C
X a 1 a 3
Y b 2 b 4
Zauważ, że indeks został zachowany i mamy 4 kolumny. 2 kolumny od left
i 2 od right
.
Jeśli indeksy nie zostały wyrównane
left.join(right.reset_index(), lsuffix='_', how='outer')
A_ B index A C
0 NaN NaN X a 3.0
1 NaN NaN Y b 4.0
X a 1.0 NaN NaN NaN
Y b 2.0 NaN NaN NaN
Użyłem złączenia zewnętrznego, aby lepiej zilustrować tę kwestię. Jeśli indeksy nie zostaną wyrównane, wynikiem będzie suma indeksów.
Możemy powiedzieć join
aby użyło określonej kolumny w lewej ramce danych jako klucza łączenia, ale nadal będzie korzystał z indeksu z prawej strony.
left.reset_index().join(right, on='index', lsuffix='_')
index A_ B A C
0 X a 1 a 3
1 Y b 2 b 4
merge
Pomyśl o merge
jako o wyrównaniu do kolumn. Domyślnie merge
będzie szukać nakładających się kolumn, w których zostaną scalone. merge
daje lepszą kontrolę nad kluczami scalania, pozwalając użytkownikowi określić podzbiór nakładających się kolumn do użycia z on
parametrem lub osobno pozwolić na określenie, które kolumny po lewej i które kolumny po prawej mają zostać scalone.
merge
zwróci połączoną ramkę danych, w której indeks zostanie zniszczony.
W tym prostym przykładzie nakładająca się kolumna ma wartość 'A'
i łączy się na jej podstawie.
left.merge(right)
A B C
0 a 1 3
1 b 2 4
Zwróć uwagę, że indeks wynosi [0, 1]
i nie jest już ['X', 'Y']
Możesz jawnie określić, że left_index
indeks z parametrem left_index
lub right_index
left.merge(right, left_index=True, right_index=True, suffixes=['_', ''])
A_ B A C
X a 1 a 3
Y b 2 b 4
I to wygląda dokładnie tak jak powyższy przykład join
.