首页 > 解决方案 > 根据条件替换指定列列表中的值

问题描述

实际用例是我想在某些命名列中的所有值小于零时用零替换它们,但不理会其他列。假设在下面的数据框中,我想将列中的所有值降a为零b,但不理会列d

df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1],
                       'c': ['foo', 'goo', 'bar'], 'd' : [1,-2,1]})
df 
   a  b    c  d
0  0 -3  foo  1
1 -1  2  goo -2
2  2  1  bar  1

该问题已接受答案的第二段:如何将 Pandas 数据框中的负数替换为零确实提供了一种解决方法,我可以将列的数据类型设置d为非数字,然后再将其更改回来:

df['d'] = df['d'].astype(object)
num = df._get_numeric_data()
num[num <0] = 0
df['d'] = df['d'].astype('int64')
df
   a  b    c  d
0  0  0  foo  1
1  0  2  goo -2
2  2  1  bar  1

但这看起来真的很乱,这意味着我需要知道我不想更改的列的列表,而不是我想要更改的列表。

有没有办法直接指定列名

标签: python-3.xpandasdataframe

解决方案


您可以使用mask和列过滤:

df[['a','b']] = df[['a','b']].mask(df<0, 0)
df

输出

   a  b    c  d
0  0  0  foo  1
1  0  2  goo -2
2  2  1  bar  1

推荐阅读