Python 熊猫海螺失败
我正试图基于foll来解析数据帧。2个csv文件: df_a: df_b: 它们都有相同的列数和列名。但是,当我这样做时: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 如何解决此问题?我认为如果满足以下两个条件,则会出现此错误: 数据帧具有不同的列
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()]