Pandas concat терпит неудачу

Я пытаюсь объединить кадры данных на основе следующих. 2 CSV-файла:

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

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

3 ответа

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

  1. Фреймы данных имеют разные столбцы. (т.е. (df1.columns == df2.columns) является ложным
  2. Столбцы имеют повторное значение.

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

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

Ответы здесь не решили мою проблему, но этот ответ помог.

Проблема заключалась в дублировании столбцов в одном или обоих фреймах данных.

Вот исправление повторяющегося столбца (согласно ответу выше):

df = df.loc[:,~df.columns.duplicated()]

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

list_of_dfs = [df_a, df_b]

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

giant_concat_df = pd.concat(list_of_dfs,0)

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

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)))

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

  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

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

Другие вопросы по тегам