如何过滤熊猫系列索引中的字符串

Posted

技术标签:

【中文标题】如何过滤熊猫系列索引中的字符串【英文标题】:How to filter strings in pandas series index 【发布时间】:2014-10-03 09:21:40 【问题描述】:

我正在尝试通过在其包含字符串的索引上使用布尔表达式来过滤熊猫系列。例如,在下面的代码中,我希望通过为索引项包含子字符串“man”的行过滤另一个系列(S)来创建一个新系列(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】:

您可以使用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,因为这会检查索引中是否包含确切的标签“人”(事实并非如此)。

【讨论】:

感谢 Joris,您的两个建议确实有效。令人惊讶的是,第二种手动替代方法比“过滤器”方法中的烘焙速度快 2.9 倍。 但是你错了 S['man' in S] 返回 False。它实际上返回 31,这是与 'batman' 关联的值 不,我的意思是返回 False 的是 'man' in S,所以你实际上做了 S[False],我认为它返回了第一个值,因为它认为它是 0(对于蝙蝠侠来说确实是 31如果我运行它)。顺便说一句,如果是这种情况,您应该接受将您的问题标记为已解决的答案(也适用于您的其他问题) 啊,是的,Joris 关于 S 中的“人”返回 False 是对的。我向你更大的智慧鞠躬,再次感谢你的帮助。 也感谢您接受答案的提示。我没有意识到这是协议的一部分。实际上,我花了几分钟才弄明白你所说的“接受答案”是什么意思——Doh!

以上是关于如何过滤熊猫系列索引中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

过滤熊猫数据框列中的字符串/浮点数/整数值

如何根据熊猫中的if-else条件从元组索引中提取字符串?

如何将日期和小时列合并到熊猫系列中的一个索引列中?

如何从熊猫系列中的字符串中去除“$”符号?

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?

日期时间到熊猫系列中的字符串