如何在pandas系列索引中过滤字符串

8

我正在尝试使用布尔表达式在 pandas 系列的索引上过滤,该索引包含字符串。例如,在下面的代码中,我希望通过筛选另一个系列 (S) 中索引项包含子字符串 'man' 的行来创建一个新系列 (Sman):

from pandas import Series
S = Series({'moondog':12,'catman':23, 'batman':31, 'catdog':42})
Sman = S['man' in S]

然而,对于Sman的结果只是数字31,并没有像我希望的那样包含'catman'和'batman'的行的新系列。
我错在哪里了?
1个回答

11
您可以使用filter方法:
In [11]: S.filter(like='man')
Out[11]:
batman    31
catman    23
dtype: int64

一个手动的替代方案是:

In [12]: S[['man' in i for i in S.index]]
Out[12]:
batman    31
catman    23
dtype: int64
你的方法没有成功的原因是'man' in S只返回False,因为它检查的是索引中是否包含确切的标签“man”(这不是情况)。

谢谢Joris,你的两个建议确实都有效。令人惊讶的是,第二个手动替代方法比内置的“filter”方法快2.9倍。 - dreme
但是你关于 S['man' in S] 返回 False 是错误的。它实际上返回 31,这是与 'batman' 相关联的值。 - dreme
不,我的意思是在S中'man'返回了False,所以你实际上执行了S[False],我认为它将第一个值作为0(如果我运行它,则确实是31个蝙蝠侠)。顺便说一句,如果问题已经解决,你应该接受答案来标记你的问题已解决(也适用于你的其他问题)。 - joris
啊,是的,Joris,你说得对,S中的“man”返回False。我向你更高的智慧致敬,并再次感谢你的帮助。 - dreme
谢谢您提醒我接受答案的提示。我之前并没有意识到这是协议的一部分。实际上,我花了几分钟才明白您所说的“接受答案”的含义 - 哎呀! - dreme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接