2014-12-05 28 views
6

Sto cercando di unire due dataframe che contengono la stessa colonna chiave. Alcune delle altre colonne hanno intestazioni identiche, anche se non un numero uguale di righe, e dopo la fusione queste colonne sono "duplicate" con le intestazioni originali dato un poscritto _x, _y, ecc.L'unione di due dataframe panda genera colonne "duplicate"

Qualcuno sa come ottenere panda per rilasciare le colonne duplicate nell'esempio qui sotto?

Questo è il mio codice Python:

import pandas as pd 

holding_df = pd.read_csv('holding.csv') 
invest_df = pd.read_csv('invest.csv') 

merge_df = pd.merge(holding_df, invest_df, on='key', how='left').fillna(0) 
merge_df.to_csv('merged.csv', index=False) 

E i file CSV contengono questo:

prime file della sinistra-dataframe (holding_df)

key, dept_name, res_name, year, need, holding 
DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1 
DeptA_ResA_2016, DeptA, ResA, 2016, 1, 1 
DeptA_ResA_2017, DeptA, ResA, 2017, 1, 1 
... 

destro del dataframe (invest_df)

key, dept_name, res_name, year, no_of_inv, inv_cost_wo_ice 
DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1000000 
DeptA_ResB_2015, DeptA, ResB, 2015, 2, 6000000 
DeptB_ResB_2015, DeptB, ResB, 2015, 1, 6000000 
... 

risultato unito

key, dept_name_x, res_name_x, year_x, need, holding, dept_name_y, res_name_y, year_y, no_of_inv, inv_cost_wo_ice 
DeptA_ResA_2015, DeptA, ResA, 2015, 1, 1, DeptA, ResA, 2015.0, 1.0, 1000000.0 
DeptA_ResA_2016, DeptA, ResA, 2016, 1, 1, 0, 0, 0.0, 0.0, 0.0 
DeptA_ResA_2017, DeptA, ResA, 2017, 1, 1, 0, 0, 0.0, 0.0, 0.0 
DeptA_ResA_2018, DeptA, ResA, 2018, 1, 1, 0, 0, 0.0, 0.0, 0.0 
DeptA_ResA_2019, DeptA, ResA, 2019, 1, 1, 0, 0, 0.0, 0.0, 0.0 
... 
+0

aggiungerebbe più colonne per unire e continuare a fornire il risultato desiderato? 'merge_df = pd.merge (holding_df, invest_df, on = ['chiave', 'dept_name', 'res_name', 'year'], how = 'left'). fillna (0)' – EdChum

+0

'_x' e' Le colonne _y' hanno origine dai fotogrammi sinistro e destro nell'unione. Dovrai specificare più colonne per indicare che sono uguali (i panda non lo sanno). –

+0

È possibile passare un elenco di colonne a ['drop'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html#pandas.DataFrame.drop) ma rinominare sarà richiede il passaggio di un dict a ['rename'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html#pandas.DataFrame.rinomina) – EdChum

risposta

2

Il motivo avete ulteriori colonne con suffissi '_x' e '_y' è perché le colonne si uniscono non hanno valori corrispondenti in modo da questo scontro produce colonne aggiuntive. In questo caso è necessario eliminare le colonne aggiuntive '_y' e rinominare le colonne '' _x:

In [145]: 
# define our drop function 
def drop_y(df): 
    # list comprehension of the cols that end with '_y' 
    to_drop = [x for x in df if x.endswith('_y')] 
    df.drop(to_drop, axis=1, inplace=True) 

drop_y(merged) 
merged 
Out[145]: 
       key dept_name_x res_name_x year_x need holding \ 
0 DeptA_ResA_2015  DeptA  ResA  2015  1   1 
1 DeptA_ResA_2016  DeptA  ResA  2016  1   1 
2 DeptA_ResA_2017  DeptA  ResA  2017  1   1 

    no_of_inv inv_cost_wo_ice 
0   1   1000000 
1   0     0 
2   0     0 
In [146]: 
# func to rename '_x' cols 
def rename_x(df): 
    for col in df: 
     if col.endswith('_x'): 
      df.rename(columns={col:col.rstrip('_x')}, inplace=True) 
rename_x(merged) 
merged 
Out[146]: 
       key dept_name res_name year need holding no_of_inv \ 
0 DeptA_ResA_2015  DeptA  ResA 2015  1   1   1 
1 DeptA_ResA_2016  DeptA  ResA 2016  1   1   0 
2 DeptA_ResA_2017  DeptA  ResA 2017  1   1   0 

    inv_cost_wo_ice 
0   1000000 
1     0 
2     0 

EDIT Se è stato aggiunto le colonne comuni per la stampa allora non dovrebbe produrre le colonne duplicati a meno che le partite su queste colonne non corrispondono:

merge_df = pd.merge(holding_df, invest_df, on=['key', 'dept_name', 'res_name', 'year'], how='left').fillna(0) 
+0

Ma hanno valori corrispondenti! Hanno chiavi corrispondenti e valori corrispondenti esattamente nelle colonne duplicate, e quindi due colonne aggiuntive che sono solo nel giusto dataframe e non nella sinistra (da qui l'unione). – larslovlie

+0

No, non dovrebbe succedere, le colonne duplicate si verificano solo se le chiavi non sono le stesse, quindi c'è qualcosa di sbagliato nei tuoi dati – EdChum

+0

Dannazione, devo aver incasinato, perché ho aggiunto più colonne al parametro on (come prima cosa suggerito in un commento) produce il risultato desiderato. Mi dispiace per quello, non so cosa ho fatto di sbagliato quando l'ho provato io stesso. Se scrivi il tuo commento come risposta breve, lo contrassegnerò come corretto. – larslovlie

3

ho lo stesso problema con le colonne duplicati dopo sinistra si unisce anche quando i dati delle colonne è identica. Ho fatto una query e ho scoperto che i valori NaN sono considerati diversi anche se entrambe le colonne sono NaN in panda 0.14. MA una volta aggiornato a 0.15, questo problema scompare, il che spiega il motivo per cui in seguito funziona per te, probabilmente lo hai aggiornato.

0
Non

esattamente la risposta, ma pd.merge fornisce un argomento per aiutarvi a decidere quale suffissi vanno aggiunti le colonne sovrapposte:

merge_df = pd.merge(holding_df, invest_df, on='key', how='left', suffixes=('_holding', '_invest')).fillna(0) 

nomi più significativi potrebbe essere utile se si decide di mantenere sia (o per controllare perché le colonne sono mantenute).

Vedere documentation per ulteriori riferimenti.

Problemi correlati