簡體   English   中英

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

[英]Return max of zero or value for a pandas DataFrame column

我想用0替換pandas DataFrame列中的負值。

有沒有更簡潔的方法來構造這個表達式?

df['value'][df['value'] < 0] = 0

這是規范的方式,雖然不一定更簡潔,但更靈活(因為你可以將它應用於任意列)

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

您可以使用剪輯方法

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

另一種可能性是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

筆記本

我們只取大於零的值,留下那些作為NaN的負數(用於不用系列的幀),然后估算。

df[df > 0].fillna(0)

為了完整性, np.where也是一種可能性,這比這里的大多數答案更快。 np.maximum答案是最好的方法,因為它比這更快,更簡潔。

df['value'] = np.where(df.value < 0, 0, df.value)

df.value.clip_lower(0, inplace=True)最簡潔,和np.maximum一樣快,肯定比其他方法( 筆記本 )快。

或者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
>>> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM