我正在尝试通过查看字符串列表中是否存在一列字符串来过滤pandas数据框。
可重复的示例:
x = pd.DataFrame({'Letter':['a', 'b', 'c', 'd', 'e'],
'Alpha':[['a', 'z'], ['c', 'q', 'f'], 'c', 'e', ['e', 'q', 'm']]})
Alpha Letter
0 [a, z] a
1 [c, q, f] b
2 c c
3 e d
4 [e, q, m] e
尝试检查Letter是否在Alpha中。
预期输出:
Alpha Letter
0 [a, z] a
2 c c
4 [e, q, m] e
我试过了:
x[x.Letter in x.Alpha]
x[x.Letter.isin(x.Alpha)]
x[x.Letter.any(x.Alpha)]
正考虑尝试使用生成器来执行[a for a in x if a.Letter in a.Alpha]
如果有任何帮助,我可以更改起点,以便Alpha
中的所有内容都在列表中,即使它只有一个字母。
任何帮助表示赞赏!感谢
答案 0 :(得分:2)
您可以使用apply()
:
print(x[x.apply(lambda row: row.Letter in row.Alpha, axis=1)])
# Alpha Letter
#0 [a, z] a
#2 c c
#4 [e, q, m] e
答案 1 :(得分:2)
高效zip
解决方案:
y = x[[i in j for i, j in zip(x.Letter, x.Alpha)]]
通过pd.DataFrame.apply
的Pandas解决方案:
y = x[x.apply(lambda row: row['Letter'] in row['Alpha'], axis=1)]
答案 2 :(得分:1)
x[x.Alpha.apply(pd.Series).eq(x.Letter,0).any(1)]
Out[1068]:
Alpha Letter
0 [a, z] a
2 c c
4 [e, q, m] e
答案 3 :(得分:-1)
您可以使用apply来创建遮罩:
x = pd.DataFrame({'Letter':['a', 'b', 'c', 'd', 'e'],
'Alpha':[['a', 'z'], ['c', 'q', 'f'], 'c', 'e', ['e', 'q', 'm']]})
print(x[x.apply(lambda row: row['Letter'] in row['Alpha'], axis=1)])
输出:
Alpha Letter
0 [a, z] a
2 c c
4 [e, q, m] e