【问题标题】:Pandas concat failing熊猫连接失败
【发布时间】:2016-05-10 08:12:43
【问题描述】:

我正在尝试根据以下内容连接数据帧。 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

如何解决这个问题?

【问题讨论】:

  • 刚刚尝试使用您的数据,pandas==0.17.1concat 工作正常。
  • 嗯,不知道发生了什么......我仍然得到错误,我也在使用 pandas == 0.17.1
  • 我在 Ubuntu 14.04 上使用 pandas 0.17.1、Python 2.7.11,对我来说它也可以正常工作。
  • 我检查列名print df_a.columns == df_b.columns 并输出:[ True True True True True True True True True True True True True True False False True False True False False]
  • 感谢@jezrael,列名的顺序不同,但都存在。

标签: python pandas


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我认为如果满足以下两个条件就会出现这个错误:

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

    基本上,如果您 concat 具有列 [A,B,C][B,C,D] 的数据框,则可以为每个不同的列名制作一个系列。因此,如果我尝试加入第三个数据框[B,B,C],它不知道要附加哪一列,并且最终得到的不同列比它认为需要的要少。

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

    【讨论】:

    • 我在这个问题上看到的最好的解释。谢谢。
    • 我在空间扩展 geopandas 中遇到问题,由于与原始帖子非常相似的错误,.overlay() 操作失败。似乎如果两个地理数据帧具有相同的列名,它只会在输出数据帧中枚举它们一次。在第三次覆盖操作时,它会抛出这个错误。因此,如果您正在制作链叠加,请确保链中每个地理数据框的列名称都不同。
    • 谢谢! & FYI 查找重复列:duplicates = df.columns.duplicated(keep=False) [x[0] for x in tuple(zip(df.columns , duplicates)) if x[1]]
    • 重复列!当然,非常感谢您的明确回答!
    【解决方案3】:

    很遗憾,源文件已经不可用,因此我无法检查您的解决方案。在我的情况下,错误发生在:

    1. 数据框有两列同名(我有 IDid 列,然后我将它们转换为小写,因此它们变得相同)
    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
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 请注意,此解决方案的完成时间会明显不同,并且在大型数据帧上也会消耗大量内存。
      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2019-12-20
      • 2020-07-21
      相关资源
      最近更新 更多