我有一个pandas数据帧
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 :(得分:4)
您可以使用groupby
上的NAME
和apply
用于测试您的情况的lambda,并使用max
值True
如果符合条件并使用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
使用Y
后,您可以转换为N
或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
答案 1 :(得分:3)
您也可以使用transform:
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.。