首页 > 解决方案 > 如何从多列中删除包括 0 在内的所有正数并使用 pandas 保留行?

问题描述

假设我有这样的df,

  column1   column2 column3 column4
0   ab         A      -1.0      32
1   ab         B     -99.0     NaN
2   ab         A      -4.0     NaN
3   ab         B       0.0      21
4   cd         A       NaN    -998
5   cd         B      12.0    -250

是否有一种通用方法可以在不硬编码列名的情况下从 df 中删除包括 0 在内的所有正数?

我尝试了以下方法,

df.mask(df[['column3', 'column4']].ge(0))

我可以删除包括 0 在内的正数,但同时释放 column1 和 column2 的其余数据。

我想保留 column1 和 column2 的数据,同时还用 NaN 删除/替换它所有正数,包括 df 中的 0

最终df,

  column1   column2 column3 column4
0   ab         A      -1.0     NaN
1   ab         B     -99.0     NaN
2   ab         A      -4.0     NaN
3   ab         B       NaN     NaN
4   cd         A       NaN    -998
5   cd         B       NaN    -250

标签: pythonpandas

解决方案


我们可以使用DataFrame.select_dtypeswithDataFrame.mask仅将您的逻辑应用于数字列:

dfn = df.select_dtypes('number')
df[dfn.columns] = dfn.mask(dfn.ge(0))

  column1 column2  column3  column4
0      ab       A     -1.0      NaN
1      ab       B    -99.0      NaN
2      ab       A     -4.0      NaN
3      ab       B      NaN      NaN
4      cd       A      NaN   -998.0
5      cd       B      NaN   -250.0

推荐阅读