【问题标题】:Find indices of where Pandas Series contains element containing character查找 Pandas 系列包含包含字符的元素的索引
【发布时间】:2025-12-10 15:40:01
【问题描述】:

例子:

import pandas as pd    
arr = pd.Series(['a',['a','b'],'c'])

我想获取系列包含包含'a' 的元素的索引。所以我想找回索引01

我试过写

arr.str.contains('a')

但这会返回

0     True
1      NaN
2    False
dtype: object

虽然我希望它返回

0     True
1     True
2    False
dtype: object

【问题讨论】:

  • 如果arr 中的值是ate,你想要True 吗? 'a' in 'ate' 的计算结果为 True,但 'a' in ['ate'] 的计算结果为 False。根据您的需要,提供的答案可能不合适。
  • @piRSquared,好点子!让我们等待澄清......
  • @MaxU 的回答能够解决我的问题 - 感谢您的快速响应! (澄清一下:我想检索任何包含字母“a”的实例,包括“ate”)

标签: python string pandas contains series


【解决方案1】:

使用Series.str.join() 将单元格中的列表/数组连接成一个字符串,然后使用.str.contains('a')

In [78]: arr.str.join(sep='~').str.contains('a')
Out[78]:
0     True
1     True
2    False
dtype: bool

【讨论】:

  • 这里的答案很好!
  • 查看我对 OP 的评论...我看到问题含糊不清。我错了吗?
【解决方案2】:

使用 Series.apply 和 Python 的 in 关键字,它适用于列表和字符串

arr.apply(lambda x: 'a' in x)

如果您的 Series 中没有任何 NaN 值,这将正常工作,但如果有,您可以使用:

arr.apply(lambda x: 'a' in x if x is not np.nan else x)

这比使用Series.str 快得多。

基准测试:

%%timeit
arr.str.join(sep='~').str.contains('a')

拍摄:249 µs ± 4.83 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
arr.apply(lambda x: 'a' in x)

拍摄:70.1 µs ± 1.68 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
arr.apply(lambda x: 'a' in x if x is not np.nan else x)

拍摄:69 µs ± 1.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

【讨论】:

  • %timeit pd.Series(['a' in cell for cell in arr], index=arr.index) 会更快 ;-)
  • 哈哈,绝对!