pandas
Unisci, unisciti e concatena
Ricerca…
Sintassi
Dataframe. unire (a destra, come = 'inner', on = None, left_on = None, right_on = None, left_index = False, right_index = False, sort = False, suffixes = ('_ x', '_y'), copy = True, indicatore = Falso )
Unisci oggetti DataFrame eseguendo un'operazione di join in stile database per colonne o indici.
Se si uniscono colonne su colonne, gli indici DataFrame verranno ignorati. Altrimenti, se si uniscono indici su indici o indici su una colonna o colonne, l'indice verrà passato.
Parametri
parametri | Spiegazione |
---|---|
destra | dataframe |
Come | {'left', 'right', 'outer', 'inner'}, default 'inner' |
lasciato acceso | etichetta o lista, o array-like. Nomi dei campi per unirsi in DataFrame a sinistra. Può essere un vettore o un elenco di vettori della lunghezza di DataFrame per utilizzare un vettore particolare come chiave di join anziché colonne |
right_on | etichetta o lista, o array-like. Nomi dei campi per unirmi a destra in DataFrame o in un vettore / elenco di vettori per left_on docs |
left_index | booleano, predefinito False. Utilizzare l'indice da sinistra DataFrame come chiave di join. Se è un MultiIndex, il numero di chiavi nell'altro DataFrame (l'indice o un numero di colonne) deve corrispondere al numero di livelli |
right_index | booleano, predefinito False. Utilizzare l'indice dal DataFrame corretto come chiave di join. Gli stessi avvertimenti di left_index |
ordinare | booleano, predefinito Fals. Ordinare le chiavi di join lessicograficamente nel risultato DataFrame |
suffissi | Sequenza di 2 lunghezze (tupla, lista, ...). Suffisso da applicare ai nomi di colonne sovrapposte rispettivamente sul lato sinistro e destro |
copia | booleano, predefinito True. Se False, non copiare i dati inutilmente |
indicatore | booleano o stringa, predefinito False. Se True, aggiunge una colonna per emettere DataFrame chiamato "_merge" con informazioni sull'origine di ogni riga. Se stringa, la colonna con le informazioni sull'origine di ogni riga verrà aggiunta all'output DataFrame e la colonna verrà denominata con il valore di stringa. La colonna Informazioni è di tipo Categoriale e assume un valore di "left_only" per le osservazioni la cui chiave di unione viene visualizzata solo in "Data" di sinistra, "right_only" per le osservazioni la cui chiave di unione viene visualizzata solo in "Data" DataFrame e "entrambi" se la la chiave di fusione dell'osservazione si trova in entrambi. |
fondersi
Ad esempio, vengono date due tabelle,
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
L'obiettivo è ottenere la nuova tabella T3:
id x y s1 s2 s3
8 42 1.9 55 56 58
9 30 1.9 57 58 60
Che è quello di creare colonne s1
, s2
e s3
, ciascuna corrispondente a una riga (il numero di righe per id
è sempre fisso e uguale a 3)
Applicando join
(che accetta un argomento opzionale che può essere una colonna o più nomi di colonne, che specifica che il DataFrame passato deve essere allineato su quella colonna in DataFrame). Quindi la soluzione può essere come mostrato di seguito:
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
Se li separo:
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
Unione di due DataFrames
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
Join interno:
Utilizza l'intersezione di chiavi da due DataFrames.
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
In alternativa, specificare l'intersezione di chiavi da due Dataframes.
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
Join esterno:
Utilizza l'unione delle chiavi da due 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
Unire a sinistra:
Utilizza solo le chiavi da DataFrame sinistro.
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
Giusto Iscriviti
Utilizza solo le chiavi dal giusto 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
Unione / concatenazione / unione di più frame di dati (orizzontalmente e verticalmente)
genera frame di dati di esempio:
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
unire / unire / concatenare i frame di dati [df1, df2, df3] verticalmente - aggiungere righe
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
unione / unione / concatenazione di frame di dati orizzontalmente (allineamento per indice):
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
Unisci, Unisci e Concat
L'unione dei nomi delle chiavi è la stessa
pd.merge(df1, df2, on='key')
L'unione dei nomi delle chiavi è diversa
pd.merge(df1, df2, left_on='l_key', right_on='r_key')
Diversi tipi di unione
pd.merge(df1, df2, on='key', how='left')
Unione su più chiavi
pd.merge(df1, df2, on=['key1', 'key2'])
Trattamento di colonne sovrapposte
pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))
Utilizzo dell'indice di riga invece delle chiavi di unione
pd.merge(df1, df2, right_index=True, left_index=True)
Evitare l'uso della sintassi .join
in quanto fornisce un'eccezione per le colonne sovrapposte
Fusione sull'indice dataframe sinistro e colonna destra dataframe
pd.merge(df1, df2, right_index=True, left_on='l_key')
Concetti i dati
Incollato verticalmente
pd.concat([df1, df2, df3], axis=0)
Incollato orizzontalmente
pd.concat([df1, df2, df3], axis=1)
Qual è la differenza tra join e merging
Considera i dati a left
e a 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
Pensa di join
come vuoi combinare ai dataframes in base ai loro rispettivi indici. Se ci sono colonne sovrapposte, join
ti consente di aggiungere un suffisso al nome della colonna sovrapposta dal dataframe sinistro. I nostri due dataframe hanno un nome di colonna sovrapposto A
left.join(right, lsuffix='_')
A_ B A C
X a 1 a 3
Y b 2 b 4
Si noti che l'indice è conservato e abbiamo 4 colonne. 2 colonne da left
e 2 da right
.
Se gli indici non si allineano
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
Ho usato un'unione esterna per illustrare meglio il punto. Se gli indici non si allineano, il risultato sarà l'unione degli indici.
Possiamo dire a join
di utilizzare una colonna specifica nel dataframe sinistro da utilizzare come chiave di join, ma continuerà a utilizzare l'indice dalla destra.
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
Pensa a merge
come allineato sulle colonne. Per impostazione predefinita, l' merge
cerca le colonne sovrapposte su cui fondersi. merge
consente un migliore controllo sulle chiavi di unione consentendo all'utente di specificare un sottoinsieme delle colonne sovrapposte da utilizzare con il parametro on
o consentire separatamente la specifica di quali colonne a sinistra e di quali colonne sulla destra devono essere unite.
merge
restituirà un dataframe combinato in cui l'indice verrà distrutto.
Questo semplice esempio trova la colonna sovrapposta come 'A'
e combina in base ad essa.
left.merge(right)
A B C
0 a 1 3
1 b 2 4
Nota che l'indice è [0, 1]
e non più ['X', 'Y']
È possibile specificare esplicitamente che si sta unendo l'indice con il parametro left_index
o 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
E questo sembra esattamente come l'esempio di join
sopra.