Pandas 如何筛选同一列中的 Null 值和零值

Pandas How to filter on Null values and zero values in the same column

我一直在尝试修复此语法,但没有成功。如果有人能帮助我,我将不胜感激。

1    vat.loc[(vat['Sum of VAT'].isnull()) &
2            (vat['Sum of VAT'] == 0) &
3            (vat['Comment'] == 'Transactions 0DKK') &
4            (vat['Memo (Main)'] != '- None -'), 'Comment'] = 'Travel bill'
5    vat[vat["Comment"] == "Travel bill"]

问题出在第一行和第二行。由于针对同一列中的空值和零 (0) 值的过滤器不会同时发生,因此我得到一个空数据框作为输出。有没有更好的方法来组合第 1 行和第 2 行,以便获得所需的输出。如果我删除第一行或第二行,我会得到一个输出,但它不是我想要的。我曾尝试使用 isin() 方法,但它对我 100% 不起作用。否则,整个代码可以完美运行,但我如何连接第一行和第二行?

您可以通过两种方法解决此问题:

a) 您可以用 NaN 替换零,然后您可以进一步过滤 NULL 值。所以我的意思是说,做一些像

vat['Sum of VAT'] = vat['Sum of VAT'].replace(0, np.nan)
1 vat.loc[(vat['Sum of VAT'].isnull()) &
3            (vat['Comment'] == 'Transactions 0DKK') &
4            (vat['Memo (Main)'] != '- None -'), 'Comment'] = 'Travel bill'

b) 或者,您可以简单地使用 isin 方法:

1 vat.loc[(vat['Sum of VAT'].isin(0, np.nan)) &
3            (vat['Comment'] == 'Transactions 0DKK') &
4            (vat['Memo (Main)'] != '- None -'), 'Comment'] = 'Travel bill'

通过使用以上两种方法中的任何一种,您都可以从代码中忽略 L#2。

空dataframe的原因确实是前两个条件,列Sum of VAT不能同时为null和0,所以&条件应该换成| 作为 -

vat.loc[((vat['Sum of VAT'].isnull()) | (vat['Sum of VAT'] == 0)) &
        (vat['Comment'] == 'Transactions 0DKK') &
        (vat['Memo (Main)'] != '- None -'), 'Comment'] = 'Travel bill'

或 使用 isin 作为 -

vat.loc[(vat['Sum of VAT'].isin([np.nan, 0])) &
        (vat['Comment'] == 'Transactions 0DKK') &
        (vat['Memo (Main)'] != '- None -'), 'Comment'] = 'Travel bill'