使用之前检查行覆盖Dataframe中的值

时间:2016-08-03 11:46:11

标签: python-3.x pandas dataframe categorical-data trend

所以DataFrame是:

1 28.3  
2 27.9  
3 22.4  
4 18.1  
5 15.5  
6 7.1  
7 5.1   
8 12.0   
9 15.1  
10 10.1

现在,我想用HSE替换全部超过25,用LSE替换以下全部。其他方面是"Middle"。但我想知道它是否超过25或低于8,然后才得到"中"。因此,如果它超过25,我会用" fHtM"如果它低于8,我会用" fLtM"替换该值。

提前谢谢。

期望的输出:

也许是这样的:

1 S4  
2 S4  
3 S4  
4 dS3 (down to class S3)  
5 dS3  
6 dS2  
7 dS1  
8 uS2 (up to class S2)  
9 uS3  
10 dS2  

1 个答案:

答案 0 :(得分:2)

您可以使用cut

<div class="container">
  <div class="section">
    <div class="text">
      <b>Case 1:</b>
      Gray has lower height than orange
    </div>
    <div class="icon">
    </div>
  </div>
  <div class="section">
    <div class="text tall">
      <b>Case 2:</b>
      Gray has bigger height than orange
    </div>
    <div class="icon">
    </div>
  </div>
</div>

如果需要添加趋势,请使用diff

解释

首先从bins = [-np.inf, 6, 13, 19, np.inf] labels=['S1','S2','S3','S4'] df['label'] = pd.cut(df['value'], bins=bins, labels=labels) print (df) a value label 0 1 28.3 S4 1 2 27.9 S4 2 3 22.4 S4 3 4 18.1 S3 4 5 15.5 S3 5 6 7.1 S2 6 7 5.1 S1 7 8 12.0 S2 8 9 15.1 S3 9 10 10.1 S2 label列中获取第二个字符,将其转换为str[1]个数字并计算diff。如果重复,则会收到int,因此需要按0替换它们,然后按NaN转发。

ffill()

然后使用numpy.where创建dif = (df.label.str[1].astype(int).diff().replace(0,np.nan).ffill()) print (dif) 0 NaN 1 NaN 2 NaN 3 -1.0 4 -1.0 5 -1.0 6 -1.0 7 1.0 8 1.0 9 -1.0 Name: label, dtype: float64 ,其中值为u1其中为d,如果其他内容添加到列{ {1}}。

-1