返回pandas DataFrame列的最大值为零或值

bjo*_*son 24 python pandas

我想用0替换pandas DataFrame列中的负值.

有没有更简洁的方法来构造这个表达式?

df['value'][df['value'] < 0] = 0
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 17

您可以使用剪辑方法:

import pandas as pd
import numpy as np
df = pd.DataFrame({'value': np.arange(-5,5)})
df['value'] = df['value'].clip(0, None)
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

   value
0      0
1      0
2      0
3      0
4      0
5      0
6      1
7      2
8      3
9      4
Run Code Online (Sandbox Code Playgroud)

  • 另外,您不需要将`np.inf`作为第二个参数.默认为None,在这种情况下是等效的.如果你担心留下第二个参数的可读性,你可以改用`df.value.clip_lower(0)`. (2认同)

Jef*_*eff 16

这是规范的方式,虽然不一定更简洁,但更灵活(因为你可以将它应用于任意列)

In [39]: df = DataFrame(randn(5,1),columns=['value'])

In [40]: df
Out[40]: 
      value
0  0.092232
1 -0.472784
2 -1.857964
3 -0.014385
4  0.301531

In [41]: df.loc[df['value']<0,'value'] = 0

In [42]: df
Out[42]: 
      value
0  0.092232
1  0.000000
2  0.000000
3  0.000000
4  0.301531
Run Code Online (Sandbox Code Playgroud)


小智 13

另一种可能性是numpy.maximum().在我看来,这更直接.

import pandas as pd
import numpy as np
df['value'] = np.maximum(df.value, 0)
Run Code Online (Sandbox Code Playgroud)

它也比所有其他方法快得多.

df_orig = pd.DataFrame({'value': np.arange(-1000000, 1000000)})

df = df_orig.copy()
%timeit df['value'] = np.maximum(df.value, 0)
# 100 loops, best of 3: 8.36 ms per loop

df = df_orig.copy()
%timeit df['value'] = np.where(df.value < 0, 0, df.value)
# 100 loops, best of 3: 10.1 ms per loop

df = df_orig.copy()
%timeit df['value'] = df.value.clip(0, None)
# 100 loops, best of 3: 14.1 ms per loop

df = df_orig.copy()
%timeit df['value'] = df.value.clip_lower(0)
# 100 loops, best of 3: 14.2 ms per loop

df = df_orig.copy()
%timeit df.loc[df.value < 0, 'value'] = 0
# 10 loops, best of 3: 62.7 ms per loop
Run Code Online (Sandbox Code Playgroud)

(笔记本)