Pandas Boolean .any()。all()

时间:2015-01-06 03:28:39

标签: python pandas

在尝试使用pandas进行布尔测试时,我不断获得ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().。不明白它说的是什么,我决定试图解决它。

然而,我现在完全感到困惑。

这里我创建了两个变量的数据框,它们之间共享一个数据点(3):

In [75]:

import pandas as pd

df = pd.DataFrame()

df['x'] = [1,2,3]
df['y'] = [3,4,5]

现在我尝试所有(x小于y),我将其翻译为“x的所有值都小于y”,我得到一个没有意义的答案。

In [79]:

if all(df['x'] < df['y']):
    print('True')
else:
    print('False')
True

接下来我尝试任何(x小于y),我将其翻译为“x小于y的任何值”,我得到另一个没有意义的答案。

In [77]:

if any(df['x'] < df['y']):
    print('True')
else:
    print('False')
False

简而言之:any()和all()实际上做了什么?

2 个答案:

答案 0 :(得分:7)

Pandas建议您使用Series方法any()all(),而不是Python in-build函数。

我不太了解你所拥有的奇怪输出的来源(我在Python 2.7和Pandas 0.17.0中都得到了True)。但尝试以下,它应该工作。这使用Series.any()Series.all()方法。

import pandas as pd

df = pd.DataFrame()

df['x'] = [1,2,3]
df['y'] = [3,4,5]

print (df['x'] < df['y']).all() # more pythonic way of
print (df['x'] < df['y']).any() # doing the same thing

这应该打印:

True
True

答案 1 :(得分:0)

要比较两个 pd.DataFrame 对象的内容和结构相等性,您可以使用:

import pandas as pd

def are_df_equal(df: pd.DataFrame, df2: pd.DataFrame) -> bool:
    return df.equals(df2) and (df.all() == df2.all()).all()