gpt4 book ai didi

pandas - 在操作符中使用 Pandas 系列

转载 作者:行者123 更新时间:2023-12-04 14:23:04 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How to determine whether a Pandas Column contains a particular value

(8 个回答)


去年关闭。




为什么我不能使用 in 匹配 Pandas 系列中的字符串?在下面的示例中,第一个评估结果出乎意料地为 False,但第二个评估有效。

df = pd.DataFrame({'name': [ 'Adam', 'Ben', 'Chris' ]})
'Adam' in df['name']
'Adam' in list(df['name'])

最佳答案

在第一种情况下:

因为in运算符被解释为对 df['name'].__contains__('Adam') 的调用.如果你看看 __contains__ 的实现在 pandas.Series ,您会发现它是以下内容(从 pandas.core.generic.NDFrame 继承):

def __contains__(self, key):
"""True if the key is in the info axis"""
return key in self._info_axis

所以,你第一次使用 in被解释为:
'Adam' in df['name']._info_axis 

这给 False ,预计,因为 df['name']._info_axis实际上包含有关 range/index 的信息而不是数据本身:
In [37]: df['name']._info_axis 
Out[37]: RangeIndex(start=0, stop=3, step=1)

In [38]: list(df['name']._info_axis)
Out[38]: [0, 1, 2]

在第二种情况下:
'Adam' in list(df['name'])
list的使用, 转换 pandas.Series到值列表。所以,实际操作是这样的:
In [42]: list(df['name'])
Out[42]: ['Adam', 'Ben', 'Chris']

In [43]: 'Adam' in ['Adam', 'Ben', 'Chris']
Out[43]: True

这里有一些更惯用的方法来做你想做的事(与相关的速度):
In [56]: df.name.str.contains('Adam').any()
Out[56]: True

In [57]: timeit df.name.str.contains('Adam').any()
The slowest run took 6.25 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 144 µs per loop

In [58]: df.name.isin(['Adam']).any()
Out[58]: True

In [59]: timeit df.name.isin(['Adam']).any()
The slowest run took 5.13 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 191 µs per loop

In [60]: df.name.eq('Adam').any()
Out[60]: True

In [61]: timeit df.name.eq('Adam').any()
10000 loops, best of 3: 178 µs per loop

注意:@Wen 在上面的评论中也建议了最后一种方式

关于pandas - 在操作符中使用 Pandas 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49393053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com