按两列过滤pandas数据框,其中一列是列表

时间:2018-02-06 17:18:07

标签: python pandas

我正在尝试通过查看字符串列表中是否存在一列字符串来过滤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中的所有内容都在列表中,即使它只有一个字母。

任何帮助表示赞赏!感谢

4 个答案:

答案 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