拥有一组数据框,目标是识别重复的列名并将它们作为列表返回。
例子
输入是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]
