Pandas concat失败

ftf50wuq  于 2023-11-15  发布在  其他
关注(0)|答案(4)|浏览(176)

我正在尝试从以下两个csv文件中连接 Dataframe :

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


如何解决这个问题?

ttygqcqt

ttygqcqt1#

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

  1. Dataframe 具有不同的列。(例如,(df1.columns == df2.columns)False
    1.列具有重复值。
    基本上,如果你concat嵌套了[A,B,C][B,C,D]列,它可以为每个不同的列名创建一个系列。所以,如果我尝试加入第三个嵌套[B,B,C],它不知道要追加哪一列,并且最终的不同列比它认为需要的要少。
    如果你的数组是df1.columns == df2.columns,那么它无论如何都会工作。所以你可以将[B,B,C]连接到[B,B,C],但不能连接到[C,B,B],因为如果列是相同的,它可能只是使用整数索引或其他东西。
rt4zxlrg

rt4zxlrg2#

这里的答案没有解决我的问题,但这个答案解决了。
问题在一个或两个DataFrame中重复列。

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

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

字符串

m1m5dgzv

m1m5dgzv3#

您可以通过“手动”连接来解决这个问题,在本例中,

list_of_dfs = [df_a, df_b]

字符串
而不是逃跑

giant_concat_df = pd.concat(list_of_dfs,0)


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

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

ifmq2ha2

ifmq2ha24#

不幸的是,源文件已经不可用,所以我不能检查我的解决方案在你的情况下.在我的情况下,错误发生时:
1.数据框有两个同名的列(我有IDid列,然后我将其转换为小写,因此它们变得相同)
1.同名列的值类型不同
下面是一个例子,它给我的错误问题:

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

字符串
删除/重命名其中一个列可以使此代码正常工作。

相关问题