2017-05-02 36 views
2

所以我知道這看起來微不足道的面值,但我試圖做的實際上是不同的。熊貓在數據框上的數字操作(即max())

我有一個數據幀:

x 
1 
3 
4 

,我想這樣做就可以了操作,如:

df['x']=df['x']+1 

但我也有這樣的最大值,這實際上是min(4,val)

這將實現產值:

x 
2 
4 
4 

因此,在無效的語法,我想我要做的是:df['x']=np.min(df['x']+1,4)但這不起作用。

從做

旁白:

df['x']=df['x']+1 
df[df['x']>4]['x']=4 

沒有任何人有一個更優雅的解決方案嗎?

感謝

+0

爲什麼不'DF [DF [ 'X'] <4] [ 'X'] + = 1'? – umutto

+0

所以有趣的是我嘗試了一個變種 - 'df ['x'] = df ['x'] + 1',然後'df [df ['x']> 4] ['x'] = 4'和由於某種原因沒有工作。不明白爲什麼不tbh。我之前完成了類似的操作,沒有快樂 – Henry

+0

@Henry這就是所謂的鏈式索引,它可能會產生奇怪的結果。您可以使用'df.loc [df ['x']> 4,'x'] = 4'來代替'df [df ['x']> 4] ['x'] = 4'。 – ayhan

回答

2

使用numpy.where

df['x'] = np.where(df['x'] > 3, 4, df['x'] + 1) 
#same as 
#df['x'] = np.where(df['x'] > 4 - 1, 4, df['x'] + 1) 
print (df) 
    x 
0 2 
1 4 
2 4 

或者clip_upper

df['x'] = (df['x'] + 1).clip_upper(4) 
print (df) 
    x 
0 2 
1 4 
2 4 

add也許更好:

df['x'] = df['x'].add(1).clip_upper(4) 
print (df) 
    x 
0 2 
1 4 
2 4 

編輯:

需要loc爲新值由條件:

df['x']=df['x'] + 1 
df.loc[df['x'] > 4, 'x'] = 4 
print (df) 
    x 
0 2 
1 4 
2 4 
+0

Brill謝謝:) – Henry

+0

@亨利 - 很高興能幫到你! – jezrael

3

您可以使用夾:

(df['x'] + 1).clip(upper=4) 

0 2 
1 4 
2 4 
Name: x, dtype: int64 

下也將工作:

np.minimum(df['x'] + 1, 4) 

0 2 
1 4 
2 4 
Name: x, dtype: int64 

什麼你也沒有工作,因爲np.min預計的數組。然而,np.minimum會比較兩個值(或數組),以便可以進行廣播。