如何排除少数列并替换大数据中的负值?

时间:2019-12-30 12:04:19

标签: python pandas dataframe

我有一个如下所示的数据框

import pandas as pd

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

在我的真实数据中,我有100多列。我想做的是排除两列,我想将所有其他列中的负值替换为零

我尝试过此方法,但它适用于所有列。

df[df < 0] = 0

唯一的方法是将所有列名都放在一个列表中,并进行如下所示的循环

col_list = ['a1','a2','a3','a4',..........'a100']   # in this `a21`,a22` columns are ignored from the list

for col in col_list:
    df[col] = [df[col]<0] = 0

如您所见,它冗长且效率低下。

您能以任何有效的方法来帮助我吗?

2 个答案:

答案 0 :(得分:3)

存在问题df[col_list]返回布尔值DataFrame,因此不能由df[df < 0] = 0使用指定的列名进行过滤,必须使用DataFrame.mask

col_list = df.columns.difference(['a21','a22'])
m = df[col_list] < 0

df[col_list] = df[col_list].mask(m, 0)

编辑:

对于没有a21a22的数字列,请使用DataFrame.select_dtypesIndex.difference

df = pd.DataFrame({
        'a21':list('abcdef'),
         'B':[4,5,4,5,5,4],
         'C':[-7,8,9,4,2,3],
         'D':[1,3,5,-7,1,'a'], <- object column because last `a`
         'E':[5,3,-6,9,2,-4],
         'a22':list('aaabbb')
})


col_list = df.select_dtypes(np.number).columns.difference(['a21','a22'])
m = df[col_list] < 0
df[col_list] = df[col_list].mask(m, 0)
print (df)
  a21  B  C   D  E a22
0   a  4  0   1  5   a
1   b  5  8   3  3   a
2   c  4  9   5  0   a
3   d  5  4  -7  9   b
4   e  5  2   1  2   b
5   f  4  3   a  0   b

答案 1 :(得分:2)

简单剪裁为0怎么样?

df[col_list] = df[col_list].clip(0)