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 ответа
Я считаю, что эта ошибка возникает, если выполняются следующие два условия:
- Фреймы данных имеют разные столбцы. (т.е. (df1.columns == df2.columns) является ложным
- Столбцы имеют повторное значение.
В основном, если вы объединяете кадры данных со столбцами [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)))
К сожалению, исходные файлы уже недоступны, поэтому я не могу проверить свое решение в вашем случае. В моем случае ошибка произошла, когда:
- Фреймы данных имеют два столбца с одинаковым именем (у меня было
ID
а такжеid
столбцы, которые я потом преобразовал в нижний регистр, чтобы они стали одинаковыми) - Типы значений одноименных столбцов различны
Вот пример, который дает мне ошибку:
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
Удаление / переименование одного из столбцов заставляет этот код работать.