检查pandas Series是否至少有一个项大于某个值。

34
以下代码将打印True,因为Series至少包含一个大于1的元素。然而,它似乎有点不符合Python的风格。如果想要返回True,当Series包含一个大于特定值的数字,是否有更符合Python风格的方法?
import pandas as pd

s = pd.Series([0.5, 2])
print True in (s > 1)          # True

上述答案不仅不符合Python的规范,有时还会因为某些原因返回错误的结果。例如:

s = pd.Series([0.5])
print True in (s < 1)          # False
2个回答

50

您可以使用 any 方法来检查该条件是否至少对一个值为 True

In [36]: (s > 1).any()
Out[36]: True

如何将操作扩展到一组列,以便返回所有值中是否至少有一个大于零的值? - Federico Gentile
@FedericoGentile,您是指像any(axis=1).any()这样的东西吗?首先,它将在您的子集中的所有行中进行检查,并生成Pandas Series。其次,您将检查系列是否有任何True值。如果没有,您可以在评论中提供示例,或者最好提出一个带有所有细节的新问题。 - Anton Protopopov
我的意思是,如果我有一个包含3列(A、B、C)的数据框,并且我想检查列A和B中是否至少有一个值大于0...一种可能的解决方案是这样做:(df.A > 1).any() and (df.B > 1).any()。有没有更好更优雅的方法来做到这一点? - Federico Gentile
3
你可以使用类似于(df[['A', 'B', 'C']] > 1).any(axis=1)的东西。该代码的作用是判断DataFrame中'A'、'B'、'C'三列是否存在大于1的值,并返回一个布尔Series,表示每行是否至少有一个元素大于1。 - Anton Protopopov

1

in 运算符,又称__contains__() 方法,用于检查特定的值是否存在于 Series 的索引中。

s = pd.Series([0.5], index=['a'])

'a' in (s > 1)          # True
'b' in s                # False

作为一个附注,in 运算符用于数据框时,会检查一个值是否存在于列标签中。
df = pd.DataFrame([[1]], columns=['a'])
'a' in df               # True
'b' in df               # False

换句话说,in操作符返回True或False并不意味着(s > 1)中是否有任何True值。为了使成员测试起作用,必须访问这些值。
True in (s < 1).values  # True

将值缩减为单个布尔值(如@Anton Protopopov所建议的)是完成此任务的规范方式。也可以调用Python内置的any()函数。

any(s > 1)              # False
s.gt(1).any()           # False

(s < 1).any()           # True
s.lt(1).any()           # True

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