我想将pandas DataFrame列中的负值替换为零。
有没有更简洁的方法来构建这个表达式?
df['value'][df['value'] < 0] = 0
答案 0 :(得分: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
答案 1 :(得分:15)
您可以使用clip method:
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)
产量
value
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 2
8 3
9 4
答案 2 :(得分:12)
另一种可能性是numpy.maximum()
。在我看来,这更直接。
import pandas as pd
import numpy as np
df['value'] = np.maximum(df.value, 0)
它也明显快于所有其他方法。
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
(notebook)
答案 3 :(得分:0)
让我们只取大于零的值,留下那些为负的NaN(适用于不带序列的帧),然后进行估算。
df[df > 0].fillna(0)
答案 4 :(得分:0)
出于完整性考虑,np.where
也有可能,比这里的大多数答案要快。 np.maximum
answer是最好的方法,因为它比这种方法更快,更简洁。
df['value'] = np.where(df.value < 0, 0, df.value)
答案 5 :(得分:0)
df.value.clip_lower(0, inplace=True)
最为简洁,与np.maximum
一样快,当然比这里的其他方法(notebook)还快。
答案 6 :(得分:0)
或where
进行检查:
>>> import pandas as pd,numpy as np
>>> df = pd.DataFrame(np.random.randn(5,1),columns=['value'])
>>> df
value
0 1.193313
1 -1.011003
2 -0.399778
3 -0.736607
4 -0.629540
>>> df['value']=df['value'].where(df['value']>0,0)
>>> df
value
0 1.193313
1 0.000000
2 0.000000
3 0.000000
4 0.000000
>>>