使用Pandas DataFrame的行、列索引組合提取數(shù)據(jù)后,常常需要通過某些值判斷后對其進(jìn)一步處理,而當(dāng)索引出現(xiàn)重復(fù)項時,進(jìn)行值判斷就會報標(biāo)題所示的錯誤:ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
這是因為重復(fù)索引會返回Series,而非標(biāo)量,而又有多個值的Series與標(biāo)量進(jìn)行判斷時,Pandas認(rèn)為結(jié)果可能是有的值滿足條件,有的值不滿足條件,因而其結(jié)果Pandas是無法推斷的,故而報錯。
這里為了說明此種情況,故意讓索引date在'2016-1-1'發(fā)生重疊:
date_range1=pd.date_range('2016-1-1','2017-11-15')
yz1=DataFrame(np.zeros((len(n_ix1),1)), columns=['value'], index=n_ix1)
yz1['value']=12.362
date_range2=pd.date_range('2015-2-10','2016-1-1')
yz2=DataFrame(np.zeros((len(n_ix2),1)), columns=['value'], index=n_ix2)
yz2['value']=9.5
result=pd.concat([yz1,yz2])
其結(jié)果為:
2015-02-10 9.500
... ...
2016-01-01 9.500
2016-01-01 12.362
... ...
2017-11-09 12.362
2017-11-10 12.362
2017-11-13 12.362
2017-11-14 12.362
2017-11-15 12.362
此時使用下面的條件語句進(jìn)行判斷時就會報錯ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().:
for new_date in result.index:
if(result.loc[new_date, 'value']>0.1):
要根除這種錯誤,主要是要去發(fā)現(xiàn)是否有重復(fù)索引,可以通過DataFrame.index.is_unique進(jìn)行判斷。如果原始數(shù)據(jù)文件中就具有重復(fù)索引,則可以通過去除重復(fù)索引值來糾正錯誤,具體方法如下:
result= result.groupby(result.index).first()
提醒:Pandas的DataFrame.drop_duplicates()方法是用來丟棄行列索引下的重復(fù)項的,而非索引重復(fù)項。