我想仅使用nan
替换某些列的负值。最简单的方法可能是:
for col in ['a', 'b', 'c']:
df.loc[df[col ] < 0, col] = np.nan
df
可能有很多列,我只想对特定列执行此操作。
有没有办法在一行中执行此操作?看起来这应该很容易,但我无法弄明白。
答案 0 :(得分:10)
我认为你不会比这简单得多:
>>> df = pd.DataFrame({'a': np.arange(-5, 2), 'b': np.arange(-5, 2), 'c': np.arange(-5, 2), 'd': np.arange(-5, 2), 'e': np.arange(-5, 2)})
>>> df
a b c d e
0 -5 -5 -5 -5 -5
1 -4 -4 -4 -4 -4
2 -3 -3 -3 -3 -3
3 -2 -2 -2 -2 -2
4 -1 -1 -1 -1 -1
5 0 0 0 0 0
6 1 1 1 1 1
>>> df[df[cols] < 0] = np.nan
>>> df
a b c d e
0 NaN NaN NaN -5 -5
1 NaN NaN NaN -4 -4
2 NaN NaN NaN -3 -3
3 NaN NaN NaN -2 -2
4 NaN NaN NaN -1 -1
5 0.0 0.0 0.0 0 0
6 1.0 1.0 1.0 1 1
答案 1 :(得分:7)
使用loc
和where
cols = ['a', 'b', 'c']
df.loc[:, cols] = df[cols].where(df[cols].where.ge(0), np.nan)
<强> 示范 强>
df = pd.DataFrame(np.random.randn(10, 5), columns=list('abcde'))
df
cols = list('abc')
df.loc[:, cols] = df[cols].where(df[cols].ge(0), np.nan)
df
你可以用numpy加速它
df[cols] = np.where(df[cols] < 0, np.nan, df[cols])
做同样的事情。
时间
def gen_df(n):
return pd.DataFrame(np.random.randn(n, 5), columns=list('abcde'))
因为赋值是其中的一个重要部分,所以我从头开始创建df
每个循环。我还添加了df
创建的时间。
代表n = 10000
代表n = 100000
答案 2 :(得分:5)
这是一种方式:
df[df.columns.isin(['a', 'b', 'c']) & (df < 0)] = np.nan
答案 3 :(得分:4)
您可以使用np.where
来实现此目标:
In [47]:
df = pd.DataFrame(np.random.randn(5,5), columns=list('abcde'))
df
Out[47]:
a b c d e
0 0.616829 -0.933365 -0.735308 0.665297 -1.333547
1 0.069158 2.266290 -0.068686 -0.787980 -0.082090
2 1.203311 1.661110 -1.227530 -1.625526 0.045932
3 -0.247134 -1.134400 0.355436 0.787232 -0.474243
4 0.131774 0.349103 -0.632660 -1.549563 1.196455
In [48]:
df[['a','b','c']] = np.where(df[['a','b','c']] < 0, np.NaN, df[['a','b','c']])
df
Out[48]:
a b c d e
0 0.616829 NaN NaN 0.665297 -1.333547
1 0.069158 2.266290 NaN -0.787980 -0.082090
2 1.203311 1.661110 NaN -1.625526 0.045932
3 NaN NaN 0.355436 0.787232 -0.474243
4 0.131774 0.349103 NaN -1.549563 1.196455
答案 4 :(得分:3)
当然,只需从面具中挑选出您想要的专栏:
(df < 0)[['a', 'b', 'c']]
您可以在df[(df < 0)[['a', 'b', 'c']]] = np.nan
中使用此掩码。
答案 5 :(得分:1)
如果必须是单行:
df[['a', 'b', 'c']] = df[['a', 'b', 'c']].apply(lambda c: [x>0 and x or np.nan for x in c])