我想遍历df中的所有行,检查是否满足两个条件,如果满足,将列中的值替换为其他值。我尝试了两种不同的方法:
if (sales.iloc[idx]['shelf'] in ("DRY BLENDS","LIQUID BLENDS")) & np.isnan(sales.iloc[idx]['traceable_blend']):
sales.iloc[idx]['traceable_blend'] = False
和:
if (sales.iloc[idx]['shelf'] in ("DRY BLENDS","LIQUID BLENDS")) & (sales.iloc[idx]['traceable_blend'] == np.NaN):
sales.iloc[idx]['traceable_blend'] = False
通过包含print语句,我们已经验证了if语句确实可以正常工作,但从未进行过赋值。运行循环后,“ traceable_blend”列中将包含True和NaN值,但绝不会为False。分配失败了。
这似乎可行:
if (sales.iloc[idx]['shelf'] in ("DRY BLENDS","LIQUID BLENDS")) & np.isnan(sales.iloc[idx]['traceable_blend']):
sales.at[idx, 'traceable_blend'] = False
但是我仍然想了解发生了什么。
答案 0 :(得分:1)
sales.iloc[idx]['traceable_blend']=False
这是索引链,几乎永远无法使用。实际上,您不需要循环:
sales['traceable_blend'] = sales['traceable_blend'].fillna(sales['shelf'].isin(['DRY BLENDS', 'LIQUID BLENDS']))
答案 1 :(得分:0)
Pandas提供了两个函数来检查丢失的数据(NaN或null):isnull()
和notnull()
-它们返回布尔值。我建议尝试使用这些方法,而不要使用isnan()
您还可以通过链接.values.any()