在熊猫数据框中检查NaN时的奇怪行为

时间:2020-04-15 19:58:33

标签: python pandas

我想遍历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

但是我仍然想了解发生了什么。

2 个答案:

答案 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()

来确定系列中是否缺少任何值