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列(

假设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['ids']
    类型为
    pandas.Series
  • df['id'].str
    允许我们对序列应用矢量化字符串方法(例如
    lower
    contains
  • df['ids'].str.contains('ball')
    检查序列中的每个元素,以确定元素值是否将字符串'ball'作为子字符串。结果是一系列布尔值,表示存在一个“ball”子串
  • df[df['id'].str.contains('ball')]
    将布尔“掩码”应用于数据帧,并返回包含适当记录的视图
  • na=False
    从考虑中删除na/NaN值;否则,可能会返回ValueError

如果要将筛选的列设置为新索引,还可以考虑使用;如果您想将其作为一个单独的列保留,那么
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