熊猫concat失败

use*_*827 21 python pandas

我试图基于foll连接数据帧.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])
Run Code Online (Sandbox Code Playgroud)

我收到错误:

AssertionError: Number of manager items must equal union of block items
# manager items: 20, # tot_items: 21
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

phi*_*686 23

我相信如果满足以下两个条件,则会发生此错误:

  1. 数据框具有不同的列.(即(df1.columns == df2.columns)False
  2. 列具有重复值.

基本上,如果你concat的列dataframes [A,B,C]并且[B,C,D]它可以工作,使一个系列为每个不同的列名.因此,如果我尝试加入第三个数据帧,[B,B,C]它就不知道要追加哪个列,最终会得到比它认为需要的更少的不同列.

如果您的数据帧是这样的,df1.columns == df2.columns那么无论如何它都会起作用.所以,你可以加入[B,B,C][B,B,C],但不能[C,B,B],因为如果列是相同的,它可能只是使用整数索引或东西.


Ukr*_*rge 8

这里的答案没有解决我的问题,但这个答案解决了。

问题是一个或两个 DataFrame 中的列重复。

这是一个重复的列修复(根据上面的答案):

df = df.loc[:,~df.columns.duplicated()]
Run Code Online (Sandbox Code Playgroud)


kma*_*der 6

您可以通过“手动”连接来解决此问题,在这种情况下,您的

list_of_dfs = [df_a, df_b]
Run Code Online (Sandbox Code Playgroud)

而不是运行

giant_concat_df = pd.concat(list_of_dfs,0)
Run Code Online (Sandbox Code Playgroud)

您可以使用将所有数据框转换为字典列表,然后从这些列表中创建一个新数据框(与链合并)

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)))
Run Code Online (Sandbox Code Playgroud)