我有一个如下所示的数据框
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
如您所见,它冗长且效率低下。
您能以任何有效的方法来帮助我吗?
答案 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)
编辑:
对于没有a21
和a22
的数字列,请使用DataFrame.select_dtypes
和Index.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)