Skip to main content
 首页 » 编程设计

python之查找数据框集合中的所有重复列

2024年09月07日33小虾米

拥有一组数据框,目标是识别重复的列名并将它们作为列表返回。

例子

输入是3个数据帧df1, df2 and df3:

df1 = pd.DataFrame({'a':[1,5], 'b':[3,9], 'e':[0,7]}) 
 
   a  b  e 
0  1  3  0 
1  5  9  7 
 
df2 = pd.DataFrame({'d':[2,3], 'e':[0,7], 'f':[2,1]}) 
 
   d  e  f 
0  2  0  2 
1  3  7  1 
 
df3 = pd.DataFrame({'b':[3,9], 'c':[8,2], 'e':[0,7]}) 
 
   b  c  e 
0  3  8  0 
1  9  2  7 

输出是一个列表[b, e]

请您参考如下方法:

pd.Series.duplicated

由于您使用的是 Pandas,因此可以在连接列名后使用 pd.Series.duplicated:

# concatenate column labels 
s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)]) 
 
# keep all duplicates only, then extract unique names 
res = s[s.duplicated(keep=False)].unique() 
 
print(res) 
array(['b', 'e'], dtype=object) 

pd.Series.value_counts

或者,您可以提取一系列计数并识别计数大于 1 的行:

s = pd.concat([df.columns.to_series() for df in (df1, df2, df3)]).value_counts() 
 
res = s[s > 1].index 
 
print(res) 
Index(['e', 'b'], dtype='object') 

collections.Counter

经典的 Python 解决方案是使用 collections.Counter 后跟列表理解。回想一下 list(df) 返回数据框中的列,因此我们可以使用此 map 和 itertools.chain 生成可迭代的数据计数器。

from itertools import chain 
from collections import Counter 
 
c = Counter(chain.from_iterable(map(list, (df1, df2, df3)))) 
 
res = [k for k, v in c.items() if v > 1]