我想nan仅为某些列替换负值.最简单的方法可能是:
for col in ['a', 'b', 'c']:
df.loc[df[col ] < 0, col] = np.nan
Run Code Online (Sandbox Code Playgroud)
df 可能有很多列,我只想对特定列执行此操作.
有没有办法在一行中做到这一点?看起来这应该很容易,但我还没弄清楚.
bla*_*ite 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
Run Code Online (Sandbox Code Playgroud)
使用loc和where
cols = ['a', 'b', 'c']
df.loc[:, cols] = df[cols].where(df[cols].where.ge(0), np.nan)
Run Code Online (Sandbox Code Playgroud)
示范
df = pd.DataFrame(np.random.randn(10, 5), columns=list('abcde'))
df
Run Code Online (Sandbox Code Playgroud)
cols = list('abc')
df.loc[:, cols] = df[cols].where(df[cols].ge(0), np.nan)
df
Run Code Online (Sandbox Code Playgroud)
你可以用numpy加快速度
df[cols] = np.where(df[cols] < 0, np.nan, df[cols])
Run Code Online (Sandbox Code Playgroud)
做同样的事情.
定时
def gen_df(n):
return pd.DataFrame(np.random.randn(n, 5), columns=list('abcde'))
Run Code Online (Sandbox Code Playgroud)
因为赋值是其中的一个重要部分,所以我df从头开始创建每个循环.我还添加了df创作时间.
对于 n = 10000
对于 n = 100000
这是一种方式:
df[df.columns.isin(['a', 'b', 'c']) & (df < 0)] = np.nan
Run Code Online (Sandbox Code Playgroud)