我的列表中有许多大型数据框。我将它们全部连接起来以生成一个大型数据帧。
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)
检查以下行为:
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)