在尝试使用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()实际上做了什么?
答案 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()