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

标签 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:预期的字符串或类似字节的对象

或者这个:

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

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

最佳答案

使用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]

关于python - 如果列值(字符串)包含 python 集中的任何值,如何过滤数据帧行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167381/

相关文章:

python - 如何在Python中转换单行多列数据

python - Pandas Join 未提供确切的结果

python - Pandas : Delete rows based on other rows

python 2 [错误 32] 进程无法访问该文件,因为它正被另一个进程使用

python - geopandas 可以获取 geopackage(或其他矢量文件)的所有图层吗?

python - 如何剪切特定单词后的字符串?

python - Pandas :按列分组,将列表行合并为组的单个列?

python - 管理自定义对象到额外日期和时间的最佳方法

python - 如何筛选相关对象中的字段?

python - 通过 Python 对 MySQL 数据库中的密码进行 SHA512 哈希处理