Python 如何从数据帧中筛选包含字符串模式的行
假设Python中有一个如下所示的数据帧:Python 如何从数据帧中筛选包含字符串模式的行,python,pandas,dataframe,Python,Pandas,Dataframe,假设Python中有一个如下所示的数据帧: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']}) 或者,以表格形式: ids VAL 阿巴尔1 bball 2 cnut 3 fball 4 如何筛选包含关键字“ball”的行?例如,输出应为: ids VAL 阿巴尔1 bball 2 fball 4 逐步说明(从内到外): df['ids']选择数据帧的ids列(
df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})
或者,以表格形式:
ids VAL
阿巴尔1
bball 2
cnut 3
fball 4
如何筛选包含关键字“ball”的行?例如,输出应为:
ids VAL
阿巴尔1
bball 2
fball 4
逐步说明(从内到外):
选择数据帧的df['ids']
列(从技术上讲,对象ids
类型为df['ids']
)pandas.Series
允许我们对序列应用矢量化字符串方法(例如df['id'].str
,lower
)contains
检查序列中的每个元素,以确定元素值是否将字符串'ball'作为子字符串。结果是一系列布尔值,表示存在一个“ball”子串df['ids'].str.contains('ball')
将布尔“掩码”应用于数据帧,并返回包含适当记录的视图df[df['id'].str.contains('ball')]
从考虑中删除na/NaN值;否则,可能会返回ValueErrorna=False
str.contains
是一种方法
假设你有
df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']})
ids vals
0 aball 1
1 bball 2
2 cnut 3
3 fball 4
4 ballxyz 5
您的计划是过滤ids
包含ball
的所有行,并将ids
设置为新索引,您可以这样做
df.set_index('ids').filter(like='ball', axis=0)
给
vals
ids
aball 1
bball 2
fball 4
ballxyz 5
但是filter
还允许您传递正则表达式,因此您也可以只过滤列条目以ball
结尾的行。在本例中,您使用
df.set_index('ids').filter(regex='ball$', axis=0)
vals
ids
aball 1
bball 2
fball 4
请注意,现在不包括带有ballxyz
的条目,因为它以ball
开头,而不是以它结尾
如果要获取所有以ball
开头的条目,可以使用
df.set_index('ids').filter(regex='^ball', axis=0)
屈服
vals
ids
ballxyz 5
同样的作品有柱子;然后您只需更改
轴=0
零件。如果您根据列进行筛选,它将是axis=1
请您解释一下该代码在做什么以及它是如何工作的,好吗?如何使用部分匹配并使用部分匹配获取剩余字符串'#':str
诸如此类的内容?绝对喜欢有人进行逐步解释。这真的有助于理解!如果将'ball'
替换为'|'。join(球的列表)
可以将字符串列表应用于搜索。当“|”join(球的列表)
创建一个带有或搜索有效字符串的正则表达式时,您可以使过滤器不区分大小写添加case=False
,在df[df['id'].str.contains('ball',case=False,na=False)]
中重新使用时,您应该接受已发布的5个答案中的一个,投票按钮下面会有一个勾号,请注意,str.contains
答案可能是满足您要求的最快且推荐的方法:您如何将其反转以查找所有不包含字符串的行?@user4896331-df[~df['ids'].str.contains(“ball”)]
,~
否定条件如果它是一个特定的词,要否定它,您还可以使用:df=df[df.id!=“ball”]@Brian-是的,在上面的df中,您可以尝试df=df[df.id!=“aball”]
来查看它的作用。@Amit:我需要按id而不是名称访问列。然而,尝试str会给我一个错误[AttributeError:'DataFrame'对象没有属性'str'],new pandas不支持它,还是因为基于数字的访问?我刚刚看到了你的帖子,因为我正在寻找类似的解决方案。我使用了你提到的过滤方法,但是没有得到想要的结果。问题是你是否介意看一看我的代码/方法是否有问题?在我看来,这应该是非常简单的,尽管我无法让它工作。@BowenLiu:我在那里添加了一个答案,请检查一下这是否对你有效。我刚在笔记本上过夜。我会很快做到的,非常感谢。这应该是公认的答案。
df.set_index('ids').filter(regex='ball$', axis=0)
vals
ids
aball 1
bball 2
fball 4
df.set_index('ids').filter(regex='^ball', axis=0)
vals
ids
ballxyz 5