Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫海螺失败_Python_Pandas - Fatal编程技术网

Python 熊猫海螺失败

Python 熊猫海螺失败,python,pandas,Python,Pandas,我正试图基于foll来解析数据帧。2个csv文件: df_a: df_b: 它们都有相同的列数和列名。但是,当我这样做时: pandas.concat([df_a, df_b]) 我得到一个错误: AssertionError: Number of manager items must equal union of block items # manager items: 20, # tot_items: 21 如何解决此问题?我认为如果满足以下两个条件,则会出现此错误: 数据帧具有不同的列

我正试图基于foll来解析数据帧。2个csv文件:

df_a:

df_b:

它们都有相同的列数和列名。但是,当我这样做时:

pandas.concat([df_a, df_b])
我得到一个错误:

AssertionError: Number of manager items must equal union of block items
# manager items: 20, # tot_items: 21

如何解决此问题?

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

  • 数据帧具有不同的列。(即
    (df1.columns==df2.columns)
    False
  • 列具有重复的值
  • 基本上,如果您使用列
    [A,B,C]
    [B,C,D]
    连接
    数据帧,它可以为每个不同的列名创建一个系列。因此,如果我尝试连接第三个数据帧
    [B,B,C]
    ,它不知道要附加哪个列,并且最终得到的不同列少于它认为需要的列


    如果您的数据帧是这样的
    df1.columns==df2.columns
    ,那么它仍然可以工作。因此您可以将
    [B,B,C]
    加入到
    [B,B,C]
    ,而不是加入到
    [C,B,B]
    ,就好像列是相同的,它可能只是使用整数索引或其他什么。

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

    list_of_dfs = [df_a, df_b]
    
    而不是跑步

    giant_concat_df = pd.concat(list_of_dfs,0)
    
    您可以使用将所有数据帧转换为字典列表,然后从这些列表中创建新的数据帧(与链合并)


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

  • 数据帧有两个名称相同的列(我有
    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
    

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

    此处的答案无法解决我的问题,但答案解决了

    问题在一个或两个数据帧中重复列

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


    刚刚试过你的数据,
    pandas==0.17.1
    concat
    工作正常。嗯,不确定发生了什么……我仍然得到错误,我也在使用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-False-True-False-False]
    谢谢@jezrael,列名的顺序不一样,但它们都存在。关于这个问题,我看到了最好的解释。谢谢。我在空间扩展geopandas中遇到了一个问题,
    .overlay()
    操作失败,原因是错误与原始帖子非常相似。如果两个geodataframes的列名相同,则它将在输出数据帧中仅枚举一次。在第三个覆盖操作中,它将抛出此错误。因此,如果要进行链覆盖,请确保两个geodataframes的列名不同链中的每个geodataframe。感谢!&FYI查找重复列:duplicates=df.columns.duplicated(keep=False)[x[0]表示元组中的x(zip(df.columns,duplicates)),如果x[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
    
    df = df.loc[:,~df.columns.duplicated()]