Python pandas:pd.concat会导致重复的列
我在列表中有许多大型数据帧。我将它们连接起来以生成一个大数据帧Python pandas:pd.concat会导致重复的列,python,pandas,Python,Pandas,我在列表中有许多大型数据帧。我将它们连接起来以生成一个大数据帧 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.dup
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()
验证了输入数据帧具有唯一的列
熊猫版本使用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
检查以下行为:
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\u duplicates()
删除这些重复行:
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
如果在
pd.concat(df_列表)
中所示的axis=0
上进行压缩时有重复的列,则表示df_列表中的一个或多个数据帧具有重复的列名。您可以将最后一个代码循环到df_列表中的每个元素
,以查找该数据帧<代码>[df.columns.duplicated().any()用于df_列表中的df]
@anky Yes。我已经这么做了。所有源数据帧都有唯一的列--已验证。Mayank:我看到默认值为axis=0的重复列。如何?你能把这个贴在问题上吗?我已经更新了答案。你说的这个案子很奇怪。请获取数据帧的子集并正确检查。肯定有什么东西错过了。是的。我正在寻找一些线索,当这可能发生的帧是相当大的。
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