2015-01-22 41 views
9

Mi manca sicuramente qualcosa di semplice qui. Cercando di unire due dataframe in panda che hanno per lo più gli stessi nomi di colonna, ma il dataframe giusto ha alcune colonne che la sinistra non ha, e viceversa.I panda uniscono due dataframes con colonne diverse

>df_may 

    id quantity attr_1 attr_2 
0 1  20  0  1 
1 2  23  1  1 
2 3  19  1  1 
3 4  19  0  0 

>df_jun 

    id quantity attr_1 attr_3 
0 5   8  1  0 
1 6  13  0  1 
2 7  20  1  1 
3 8  25  1  1 

Ho provato unendo con un outer join:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer") 

Ma che i rendimenti:

Left data columns not unique: Index([.... 

ho specificato anche una singola colonna di unirsi (on = " id ", eg), ma che duplica tutte le colonne tranne" id "come attr_1_x, attr_1_y, che non è l'ideale. Ho anche passato l'intero elenco di colonne (ci sono molti) su "On":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values)) 

che produce:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 

Che cosa mi manca? Mi piacerebbe ottenere un df con tutte le righe aggiunte, e attr_1, attr_2, attr_3 popolate dove possibile, NaN dove non vengono mostrate. Questo mi sembra un flusso di lavoro piuttosto tipico per i dati munging, ma sono bloccato.

Grazie in anticipo.

+0

Penso che si desidera 'mayjundf = pd .DataFrame.merge (df_may, df_jun, how = "outer", on = 'id') ' – EdChum

+0

Hai specificato" how "due volte, produce: SyntaxError: argomento keyword ripetuto – economy

+0

In realtà penso che tu voglia:' pd.concat ([df_may, df_jun], axis = 0, ignore_index = True) ' – EdChum

risposta

18

Credo che in questo caso concat è ciò che si vuole:

In [12]: 

pd.concat([df,df1], axis=0, ignore_index=True) 
Out[12]: 
    attr_1 attr_2 attr_3 id quantity 
0  0  1  NaN 1  20 
1  1  1  NaN 2  23 
2  1  1  NaN 3  19 
3  0  0  NaN 4  19 
4  1  NaN  0 5   8 
5  0  NaN  1 6  13 
6  1  NaN  1 7  20 
7  1  NaN  1 8  25 

passando axis=0 qui si sta accatastamento il DF di uno sopra l'altro che credo sia quello che si desidera produrre NaN valore dove sono assente dai rispettivi dfs.

+0

Closer. C'è una restrizione sul numero di colonne per un concat? AssertionError: il numero di elementi del manager deve essere uguale all'unione degli elementi del blocco # articoli del gestore: 70, # tot_items: 71 – economy

+0

Non credo. Se si verifica un problema con i dati del mondo reale, è necessario pubblicare un campione di quel dato e codice che riproduce il tuo problema altrimenti non posso aiutarti, sarebbe utile anche se hai postato l'output da entrambi i dfs quando puoi '.info()' su di essi – EdChum

+0

Era qualcosa di semplice, un parentesi all'interno del nome della colonna da un file di formato stava causando nomi di colonne duplicati. Sto dando a @EdChum la risposta in quanto questo metodo è sicuramente il modo più semplice per ottenere l'append. – economy

0

Ho avuto questo problema oggi utilizzando uno qualsiasi dei concat, aggiungere o unire, e ho avuto intorno ad esso con l'aggiunta di una colonna aiutante numerate in sequenza e poi facendo un outer join

```helper=1 
for i in df1.index: 
    df1.loc[i,'helper']=helper 
    helper=helper+1 
for i in df2.index: 
    df2.loc[i,'helper']=helper 
    helper=helper+1 
df1.merge(df2,on='helper',how='outer')``` 
Problemi correlati