2017-05-02 35 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会比较两个值(或数组),以便可以进行广播。