当我对数据框中的单个元素进行比较时,我收到错误,但我不明白为什么。
我有一个数据框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表达式中生成错误?这对我来说毫无意义。
答案 0 :(得分:4)
问题出在if
声明中。
编码时
if this:
print(that)
this
将被评估为bool(this)
。最好还是True
或False
。
然而,你做了:
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
无法评估为True
或False
然而,pd.Series
和True
s False
。
这就是为什么它不起作用。
答案 1 :(得分:2)
问题是您需要比较返回标量的标量(True
,False
),但有一个项Series
,它会转换为一个项boolean Series
。< / p>
解决方案正在使用Series.item或values
转换为标量,并按[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