La principale differenza tra merge e concat è che l'unione ti consente di eseguire un "join" più strutturato di tabelle in cui l'uso di concat è più ampio e meno strutturato.
Unisci
Fare riferimento alla documentazione , pd.DataFrame.merge
prende come argomento richiesto il diritto , che puoi pensare come unire la tabella sinistra e la tabella destra secondo alcune operazioni di join strutturato predefinite. Notare la definizione del parametro right .
Parametri obbligatori
- a destra : DataFrame o Series denominato
Parametri opzionali
- come : {'left', 'right', 'outer', 'inner'} default 'inner'
- su : etichetta o elenco
- left_on : etichetta o elenco o simile a un array
- right_on : etichetta o elenco o simile a un array
- left_index : bool, valore predefinito False
- right_index : bool, valore predefinito False
- ordinare : bool, valore predefinito False
- suffissi : tupla di (str, str), predefinito ('_x', '_y')
- copia : bool, valore predefinito True
- indicatore : bool o str, valore predefinito False
- validate : str, opzionale
Importante: pd.DataFrame.merge
richiede il diritto di essere un pd.DataFrame
o nominatopd.Series
oggetto con .
Produzione
Inoltre, se controlliamo la docstring per l'operazione di unione sui panda è di seguito:
Eseguire un'operazione di unione del database (SQL) tra due oggetti DataFrame o Series utilizzando le colonne come chiavi o i relativi indici di riga
Concat
Fare riferimento alla documentazione di pd.concat
, innanzitutto notare che il parametro non è denominato come tabella, data_frame, serie, matrice , ecc., Ma invece objs . Cioè, puoi passare molti "contenitori di dati", che sono definiti come:
Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]
Parametri obbligatori
- objs : una sequenza o mappatura di oggetti Series o DataFrame
Parametri opzionali
- asse : {0 / "indice", 1 / "colonne"}, valore predefinito 0
- join : {'inner', 'outer'}, default 'outer'
- ignore_index : bool, valore predefinito False
- tasti : sequenza, default Nessuno
- livelli : elenco di sequenze, predefinito Nessuno
- nomi : elenco, predefinito Nessuno
- verifica_integrità : bool, valore predefinito False
- ordinare : bool, valore predefinito False
- copia : bool, valore predefinito True
Produzione
- Restituisce : oggetto, tipo di obj
Esempio
Codice
import pandas as pd
v1 = pd.Series([1, 5, 9, 13])
v2 = pd.Series([10, 100, 1000, 10000])
v3 = pd.Series([0, 1, 2, 3])
df_left = pd.DataFrame({
"v1": v1,
"v2": v2,
"v3": v3
})
df_right = pd.DataFrame({
"v4": [5, 5, 5, 5],
"v5": [3, 2, 1, 0]
})
df_concat = pd.concat([v1, v2, v3])
merge_result = df_left.merge(df_right, left_index=True, right_index=True)
concat_result = pd.concat([df_left, df_right], sort=False)
print(merge_result)
print('='*20)
print(concat_result)
Uscita codice
v1 v2 v3 v4 v5
0 1 10 0 5 3
1 5 100 1 5 2
2 9 1000 2 5 1
3 13 10000 3 5 0
====================
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
È comunque possibile ottenere il primo output (merge) con concat modificando il parametro dell'asse
concat_result = pd.concat([df_left, df_right], sort=False, axis=1)
Osserva il seguente comportamento,
concat_result = pd.concat([df_left, df_right, df_left, df_right], sort=False)
uscite;
v1 v2 v3 v4 v5
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
0 1.0 10.0 0.0 NaN NaN
1 5.0 100.0 1.0 NaN NaN
2 9.0 1000.0 2.0 NaN NaN
3 13.0 10000.0 3.0 NaN NaN
0 NaN NaN NaN 5.0 3.0
1 NaN NaN NaN 5.0 2.0
2 NaN NaN NaN 5.0 1.0
3 NaN NaN NaN 5.0 0.0
, che non è possibile eseguire un'operazione simile con l'unione, poiché consente solo un singolo DataFrame o Series denominato.
merge_result = df_left.merge([df_right, df_left, df_right], left_index=True, right_index=True)
uscite;
TypeError: Can only merge Series or DataFrame objects, a <class 'list'> was passed
Conclusione
Come avrai già notato, input e output potrebbero essere diversi tra "merge" e "concat".
Come ho detto all'inizio, la primissima differenza (principale) è che "merge" esegue un join più strutturato con un insieme di oggetti e parametri ristretti dove come "concat" esegue un join meno rigoroso / più ampio con un insieme più ampio di oggetti e parametri.
Tutto sommato, l'unione è meno tollerante alle modifiche / (l'input) e "concat" è più sciolto / meno sensibile alle modifiche / (l'input). È possibile ottenere "unione" utilizzando "concat", ma non è sempre vero il contrario.
L'operazione "Unisci" utilizza colonne di frame di dati (o nome pd.Series
dell'oggetto) o indici di riga e poiché utilizza solo quelle entità, esegue l'unione orizzontale di frame di dati o serie e di conseguenza non applica l'operazione verticale.
Se vuoi vedere di più, puoi immergerti un po 'nel codice sorgente;
.merge()
e.join()
.