数据框架:
mat = {'f1': ['A aaa', 'B sss', 'C ddd', 'B bbb'], 'f2': ['F eee', 'B bbb', 'A aaa', 'B sss']}
dict = {'A': ['A aaa'], 'B': ['B bbb', 'B sss'], 'C': ['C ddd'], 'F': ['F eee', 'F aaa']}
df = pd.DataFrame(mat)
我们可以看到键'B'在字典中有一个列表作为它的值,其中列表由两个元素组成。我需要做的是删除同一个列表中值为f1和f2的行。例如,第二行和第四行。
您可以重新编写字典以从值映射键,然后使用groupby
来标识具有所有唯一值的行:
dic = {'A': ['A aaa'], 'B': ['B bbb', 'B sss'],
'C': ['C ddd'], 'F': ['F eee', 'F aaa']}
dic2 = {v: k for k,l in dic.items() for v in l}
# {'A aaa': 'A', 'B bbb': 'B', 'B sss': 'B', 'C ddd': 'C',
# 'F eee': 'F', 'F aaa': 'F'}
out = df[df.stack().map(dic2).groupby(level=0).nunique().ne(1)]
替代:
df2 = df.stack().map(dic2).unstack()
out = df[df2.ne(df2.iloc[:, 0], axis=0).any(1)]
输出:
f1 f2
0 A aaa F eee
2 C ddd A aaa