Pandas boolean comparisson on dataframe

时间:2017-04-05 04:49:08

标签: python pandas dataframe boolean

当我对数据框中的单个元素进行比较时,我收到错误,但我不明白为什么。

我有一个数据框df,其中包含许多客户的时间序列数据,其中包含一些空值:

df.head()
                    8143511  8145987  8145997  8146001  8146235  8147611  \
2012-07-01 00:00:00      NaN      NaN      NaN      NaN      NaN      NaN   
2012-07-01 00:30:00    0.089      NaN    0.281    0.126    0.190    0.500   
2012-07-01 01:00:00    0.090      NaN    0.323    0.141    0.135    0.453   
2012-07-01 01:30:00    0.061      NaN    0.278    0.097    0.093    0.424   
2012-07-01 02:00:00    0.052      NaN    0.278    0.158    0.170    0.462  

在我的剧本中,该行 if pd.isnull(df[[customer_ID]].loc[ts]): 生成错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

但是,如果我在脚本行上放置断点,并且当脚本停止时我将其键入控制台:

pd.isnull(df[[customer_ID]].loc[ts])

输出是:

8143511    True
Name: 2012-07-01 00:00:00, dtype: bool

如果我允许脚本从该点继续,则会立即生成错误。

如果可以计算布尔表达式并且值为True,为什么它会在if表达式中生成错误?这对我来说毫无意义。

3 个答案:

答案 0 :(得分:4)

问题出在if声明中。

编码时

if this:
    print(that)

this将被评估为bool(this)。最好还是TrueFalse

然而,你做了:

if  pd.isnull(df[[customer_ID]].loc[ts]):
    pass  # idk what you did here because you didn't say... but doesn't matter

另外,您声明pd.isnull(df[[customer_ID]].loc[ts])评估为:

8143511    True
Name: 2012-07-01 00:00:00, dtype: bool

看起来像True还是False? 那么bool(pd.isnull(df[[customer_ID]].loc[ts]))呢?

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

所以课程是: pd.Series无法评估为TrueFalse

然而,pd.SeriesTrue s False

这就是为什么它不起作用。

答案 1 :(得分:2)

问题是您需要比较返回标量的标量(TrueFalse),但有一个项Series,它会转换为一个项boolean Series。< / p>

解决方案正在使用Series.itemvalues转换为标量,并按[0]选择第一个值:

customer_ID = '8143511'
ts = '2012-07-01 00:00:00'

print (df[[customer_ID]].loc[ts].item())
nan

if pd.isnull(df[[customer_ID]].loc[ts]).item():
    print ('super')
print (df[[customer_ID]].loc[ts].values[0])
nan

if pd.isnull(df[[customer_ID]].loc[ts]).values[0]:
    print ('super')

但是如果使用DataFrame.loc,请获取scalar(如果不是重复的索引或列名称):

print (df.loc[ts, customer_ID])
nan

customer_ID = '8143511'
ts = '2012-07-01 00:00:00'
if pd.isnull(df.loc[ts, customer_ID]):
    print ('super')

答案 2 :(得分:0)

第二组[]正在返回一个我误认为单个值的系列。最简单的解决方案是删除[]

if pd.isnull(df[customer_ID].loc[ts]):
       pass