如果列值(字符串)包含python中集合中的任何值,如何过滤数据帧行?

时间:2016-03-22 23:54:05

标签: python pandas dataframe

如果单元格字符串包含预定义集合中的任何值,我想过滤行。

例如,对于以下数据帧:

   ids ids2  vals
0  a h  a i     1
1  b z  n a     2
2  f z  c a     3
3  n i  n h     4

我想要提取以下行(在ids列中包含' h'或' i')

   ids ids2  vals
0  a h  a i     1
3  n i  n h     4

生成数据帧的代码:

d = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a h', 'b z', 'f z', 'n i'],'ids2': ['a i', 'n a', 'c a', 'n h']})

到目前为止我做了什么:

d[d['ids'].str.contains('h')|d['ids'].str.contains('i')]

此处预定义集很小且包含区分大小写。有没有办法,我可以使用不区分大小写或使用一些列表包含方法。我试过这样做:

d[len(re.findall('h|i',d['ids'].str,re.IGNORECASE)) > 0]

但它给了我TypeError: expected string or bytes-like object

或者这个:

data[any(d['name'].str.contains(x) for x in ['h','i'])]

给出错误:KeyError: 'name' 有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

使用case = False使其不区分大小写:

d[d['ids'].str.contains('h', case=False)|d['ids'].str.contains('i',case=False)]

这绝对是一个小回旋,但它会起作用:

letters = ['h', 'i']
d[d['ids'].str.split().apply(lambda x: len(set(x).intersection(set(letters))))>0]

答案 1 :(得分:1)

您可以通过传递加入术语的正则表达式轻松完成此操作:

In [132]:
d[~d['ids'].str.contains('h|i', case=False)]

Out[132]:
   ids ids2  vals
1  b z  n a     2
2  f z  c a     3