pandas:pd.concat 导致重复的列

Sur*_*esh 11 python pandas

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

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

我的期望是 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
Run Code Online (Sandbox Code Playgroud)

May*_*wal 7

检查以下行为:

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]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法删除这些重复的行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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)