2016-08-03 116 views
2

檢查行,以便數據幀是:覆蓋價值與數據幀之前

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 

現在我想更換遍佈25 HSE和所有下面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 

回答

2

您可以使用cut

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 

如果需要增加的趨勢,使用diff

解釋:

首先從列label得到第二個字符str[1],將其轉換爲int個數並計數diff。如果重複,則得到0,因此需要用NaN替換它們,並用ffill()正向填充。

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 

然後使用numpy.where創建u其中value是1d哪裏是-1和空,如果別的什麼被添加到label列。

df['label1'] = dif.where(dif.isnull(), np.where(dif == 1.0, 'u','d')).fillna('') + df.label.astype(str) 

print (df) 
    a value label 
0 1 28.3 S4 
1 2 27.9 S4 
2 3 22.4 S4 
3 4 18.1 dS3 
4 5 15.5 dS3 
5 6 7.1 dS2 
6 7 5.1 dS1 
7 8 12.0 uS2 
8 9 15.1 uS3 
9 10 10.1 dS2 
+0

謝謝你這就像我以前一樣。但是,如果我想讓s1,s2,s3,s4這樣的4個課程,並且我想知道s3(可以說是15-18)是否在15歲以下或18歲以上。所以我不能使用isnull。 – Madddin

+0

你可以添加所需的輸出質疑嗎? – jezrael

+0

請參閱下面的期望輸出 – Madddin