2016-02-01 27 views
7

Sto provando a concatolare i datafram basati sul foll. 2 file CSV:Pandas concat fallendo

df_a: https://www.dropbox.com/s/slcu7o7yyottujl/df_current.csv?dl=0

df_b: https://www.dropbox.com/s/laveuldraurdpu1/df_climatology.csv?dl=0

Entrambi hanno lo stesso numero e nomi delle colonne. Tuttavia, quando faccio questo:

pandas.concat([df_a, df_b]) 

ottengo l'errore:

AssertionError: Number of manager items must equal union of block items 
# manager items: 20, # tot_items: 21 

come risolvere questo problema?

+1

Appena provato con i tuoi dati e 'pandas == 0.17.1' e' concat' funziona bene. – Stefan

+0

hmm, non sono sicuro di cosa stia succedendo .... ho ancora ricevuto l'errore, sto usando pandas == 0.17.1 anche – user308827

+0

Sto usando pandas 0.17.1, Python 2.7.11 su Ubuntu 14.04, e anche per me funziona bene. – agold

risposta

5

Credo che questo errore si verifica se vengono soddisfatte le seguenti due condizioni:

  1. I frame di dati hanno diverse colonne. (Ie (df1.columns == df2.columns) è False
  2. Le colonne ha un valore ripetuto.

pratica se CONCAT dataframes con colonne [A, B, C] e [B, C, D] può funzionare per creare una serie per ogni nome distinto della colonna, quindi se provo ad unire un terzo dataframe [B, B, C] non sa quale colonna aggiungere e finisce con meno colonne distinte di quanto pensi

Se i dataframes sono tali che df1.columns == df2.columns funzionerà comunque, quindi è possibile unire [B, B, C] a [B, B, C], ma non per [C, B, B], come se le colonne fossero identiche probabilmente usa solo gli indici interi o qualcosa di simile.

0

È possibile ottenere intorno a questo problema con una concatenazione 'manuale', in questo caso il vostro

list_of_dfs = [df_a, df_b] 

E invece di correre

giant_concat_df = pd.concat(list_of_dfs,0) 

È possibile utilizzare trasformare tutti i dataframes a un elenco di dizionari e quindi creare una nuova cornice dati da questi elenchi (uniti con catena)

from itertools import chain 
list_of_dicts = [cur_df.T.to_dict().values() for cur_df in list_of_dfs]  
giant_concat_df = pd.DataFrame(list(chain(*list_of_dicts))) 
0

Sfortunatamente, i file di origine ar e già non disponibile, quindi non posso controllare la mia soluzione nel tuo caso. Nel mio caso l'errore si è verificato quando:

  1. frame di dati hanno due colonne con lo stesso nome (ho avuto ID e id colonne, che ho poi convertito in minuscolo, in modo che diventino la stessa)
  2. i tipi di valore dello stesso nome colonne sono diverse

Ecco un esempio che mi dà l'errore in questione:

df1 = pd.DataFrame(data=[ 
    ['a', 'b', 'id', 1], 
    ['a', 'b', 'id', 2] 
], columns=['A', 'B', 'id', 'id']) 

df2 = pd.DataFrame(data=[ 
    ['b', 'c', 'id', 1], 
    ['b', 'c', 'id', 2] 
], columns=['B', 'C', 'id', 'id']) 
pd.concat([df1, df2]) 
>>> AssertionError: Number of manager items must equal union of block items 
# manager items: 4, # tot_items: 5 

La rimozione/ridenominazione di una colonna rende questo codice funzionante.