【问题标题】:pandas : pd.concat results in duplicated columnspandas:pd.concat 导致列重复
【发布时间】:2021-12-03 18:48:04
【问题描述】:

我的列表中有许多大型数据框。我将它们全部连接起来以生成一个大数据框。

df_list # This contains a list of dataframes
result = pd.concat(df_list, axis=0)
result.columns.duplicated().any() # This returns True

我的期望是 pd.concat 不会产生重复的列。

我想了解它何时会导致重复列,以便我可以调试源代码。

我无法用玩具数据集重现问题。

我通过运行df.columns.duplicated().any() 验证了输入数据框具有唯一的列。

使用的pandas版本是1.0.1

(Pdb) p result_data[0].columns.duplicated().any()
False
(Pdb) p result_data[1].columns.duplicated().any()
False
(Pdb) p result_data[2].columns.duplicated().any()
False
(Pdb) p result_data[3].columns.duplicated().any()
False
(Pdb) p pd.concat(result_data[0:4]).columns.duplicated().any()
True

【问题讨论】:

  • 如果您在连接axis=0 时有重复的列,如代码pd.concat(df_list) 所示,这可能意味着df_list 中的一个或多个数据框具有重复的列名。您可以将最后一个代码循环到 df_list 中的每个元素以找到该数据框。 [df.columns.duplicated().any() for df in df_list]
  • @anky 是的。我已经这样做了。所有源数据框都有唯一的列 - 已验证。

标签: python pandas


【解决方案1】:

检查以下行为:

In [452]: df1 = pd.DataFrame({'A':[1,2,3], 'B':[2,3,4]})                                                                                                                                                    

In [468]: df2 = pd.DataFrame({'A':[1,2,3], 'B':[2,4,5]})

In [460]: df_list = [df1,df2]

这会连接并保留重复的列:

In [463]: pd.concat(df_list, axis=1)                                                                                                                                                                        
Out[474]: 
   A  B  A  B
0  1  2  1  2
1  2  3  2  4
2  3  4  3  5

pd.concat 始终按原样连接数据帧。它根本不会删除重复的列。

如果您在没有轴的情况下进行连接,它将在同一列中将一个数据框附加到另一个数据框下方。

所以你现在可以有重复的行,但不能有列。

In [477]: pd.concat(df_list)                                                                                                                                                                                
Out[477]: 
   A  B
0  1  2  ## duplicate row
1  2  3
2  3  4
0  1  2  ## duplicate row
1  2  4
2  3  5

您可以使用drop_duplicates() 删除这些重复的行:

In [478]: pd.concat(df_list).drop_duplicates()                                                                                                                                                              
Out[478]: 
   A  B
0  1  2
1  2  3
2  3  4
1  2  4
2  3  5

在 OP 发表评论后更新:

In [507]: df_list[0].columns.duplicated().any()                                                                                                                                                             
Out[507]: False

In [508]: df_list[1].columns.duplicated().any()                                                                                                                                                             
Out[508]: False

In [510]: pd.concat(df_list[0:2]).columns.duplicated().any()                                                                                                                                                
Out[510]: False

【讨论】:

  • Mayank:我看到默认为 axis=0 的重复列。
  • 怎么样?您可以将其粘贴到问题中吗?
  • 我已经更新了我的答案。你说的情况很奇怪。请获取您的数据框的一个子集并正确检查。必须有一些东西被遗漏了。
  • 是的。由于框架非常大,我正在寻找有关何时会发生这种情况的一些线索。
【解决方案2】:

当我从 IEXCloud 获取数据时,我遇到了同样的问题。我使用 IEXFinance 函数来获取不同的数据集,这些数据集都假设返回数据帧。然后我使用 concat 加入数据框。它看起来已将第一列(符号)重复到第 97 列。第 96 和 98 列中的数据来自第二个数据帧。 df1 或 df2 中没有重复的列。我看不出在那里复制它的任何合乎逻辑的理由。 DF2 有 70 列。我怀疑作为“数据帧”返回的某些内容是其他内容,但这并不能解释 concat 函数选择复制第一个 df 的第一列的位置的看似随机性质!

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2012-05-09
    相关资源
    最近更新 更多