pandas : pd.concat的结果是重复的列

8 人关注

我在一个列表中拥有许多大的数据帧。我把所有的数据框串联起来,产生一个单一的大数据框。

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()
    
2 个评论
anky
如果你在 axis=0 上连接时有重复的列,如你的代码 pd.concat(df_list) 所示。你可以将你的最后一段代码循环到 df_list 中的每个元素,以找到该数据框架。【替换代码4
@anky 是的。我已经这么做了。所有的源数据框都有唯一的列 -- 已验证。
python
pandas
Suresh
Suresh
发布于 2020-04-30
2 个回答
Mayank Porwal
Mayank Porwal
发布于 2021-12-03
已采纳
0 人赞同

检查以下行为。

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

替换代码2】总是将数据帧原封不动地连接起来。它根本不会删除重复的列。

如果你在没有轴的情况下进行连接,它将在同一列的另一个数据框架下面追加一个数据框架。

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

In [477]: pd.concat(df_list)                                                                                                                                                                                
Out[477]: 
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]: 
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