2016-02-01 3 views
7

Я пытаюсь выполнить кадры данных на основе foll. 2 файлов CSV:Pandas concat failing

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

Оба они имеют одинаковое число и имена столбцов. Однако, когда я делаю это:

pandas.concat([df_a, df_b]) 

Я получаю ошибку:

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

Как это исправить?

+1

Просто попробовал свои данные и 'pandas == 0.17.1' и' concat' отлично работает. – Stefan

+0

Хмм, не уверен, что происходит .... я все еще получаю ошибку, я использую pandas == 0.17.1 также – user308827

+0

Я использую pandas 0.17.1, Python 2.7.11 на Ubuntu 14.04, и для меня он отлично работает. – agold

ответ

5

Я считаю, что эта ошибка возникает, если выполняются следующие два условия:

  1. Кадры данных имеют разные столбцы. (То есть (df1.columns == df2.columns) ложен
  2. Столбцов имеют неоднократное значение.

В принципе, если вы Concat dataframes с колоннами [A, B, C] и [B, C, D], он может работать, чтобы сделать одну серию для каждого имени столбца distinc. Поэтому, если я попытаюсь присоединиться к третьему фрейму данных [B, B, C], он не знает, какой столбец будет добавлен и в итоге будет меньше столбцов, чем он думает это необходимо.

Если ваши dataframes таковы, что df1.columns == df2.columns, то он будет работать в любом случае. Таким образом, вы можете присоединиться [B, B, C] к [B, B, C], но не к [C, B, B], как если бы столбцы были идентичны, вероятно, он просто использует целые индексы или что-то в этом роде.

0

Вы можете обойти эту проблему с помощью «ручного» конкатенации, в этом случае ваш

list_of_dfs = [df_a, df_b] 

И вместо того, чтобы работать

giant_concat_df = pd.concat(list_of_dfs,0) 

Вы можете использовать свою очередь все dataframes к списку словарей, а затем создать новый кадр данных из этих списков (объединенный с цепочкой)

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

К сожалению, исходные файлы ar e уже недоступно, поэтому я не могу проверить свое решение в вашем случае. В моем случае произошла ошибка, когда:

  1. кадры данных имеют два столбца с тем же именем (я имел ID и id столбцы, которые я затем конвертируются в нижний регистр, поэтому они становятся такими же)
  2. типы значений из одноименных столбцов отличаются

Вот пример, который дает мне ошибку в вопросе:

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 

Удаление/переименование одного из столбцов делает этот код работать.

Смежные вопросы