2016-06-30 56 views
2

我有一個熊貓數據幀選擇行給出2列,如果至少一個值低於閾值

NAME VALUE 
    A  2 
    A  1 
    B  4 
    A  3 
    C  2 
    B  8 

我想增加一列,如果在列「名稱」值包含至少一個值「值」 3以下,對應的名字,使得:

NAME VALUE BELOW_THRESHOLD 
    A  2   Y 
    A  4   Y 
    B  4   N 
    A  3   Y 
    C  2   Y 
    B  8   N 
+0

你的兩個DataFrames是不同的。第一個表中的第二個「A」的值爲1,而第二個表中的第二個「A」的值爲4. – chrisaycock

回答

4

您可以在NAMEapply使用groupby,測試你條件的拉姆達並採取max值,這將是True如果有符合條件的d分配使用map

In [317]: 
df['BELOW_THRESHOLD'] = df['NAME'].map(df.groupby('NAME')['VALUE'].apply(lambda x: (x < 3).max())) 
df 

Out[317]: 
    NAME VALUE BELOW_THRESHOLD 
0 A  2   True 
1 A  1   True 
2 B  4   False 
3 A  3   True 
4 C  2   True 
5 B  8   False 

可以轉換爲YN使用np.where後:

In [318]: 
df['BELOW_THRESHOLD'] = np.where(df['BELOW_THRESHOLD'], 'Y','N') 
df 

Out[318]: 
    NAME VALUE BELOW_THRESHOLD 
0 A  2    Y 
1 A  1    Y 
2 B  4    N 
3 A  3    Y 
4 C  2    Y 
5 B  8    N 
+0

再次感謝你:) Ur是英雄! – amc

3

您還可以使用變換:

df.groupby('NAME').transform('min') < 3 
Out[47]: 
    VALUE 
0 True 
1 True 
2 False 
3 True 
4 True 
5 False 

它返回一個布爾數組,所以如果你需要Y/N,你可以將它傳遞給像EdChum那樣的np.where。

相關問題