A B C
0 01:00:00 24 Andrew
1 01:00:00 17 Edd
2 01:00:00 12 Emma
3 01:00:00 18 Fred
4 02:00:00 38 Andrew
5 02:00:00 35 Edd
6 02:00:00 45 Emma
7 02:00:00 49 Fred
我想为每个A
组选择一行,具有下一个条件:
02:00:00
组中,B
的最小值为35
,因此请使用(35 + 10 = 45){ {1}}值。B
值。示例:在B
组中,最小值为12,但不存在(12 + 10 = 22)。因此,采用下一个较低的B值,即01:00:00
。输出应为:
18
我试过了:
A B C
0 01:00:00 18 Fred
1 02:00:00 45 Emma
答案 0 :(得分:1)
使用idxmax
的自定义lambda函数返回第一个最大行,同时将条件更改为>
:
i = (df.sort_values('B', ascending=False)
.groupby('A')['B']
.apply(lambda x: ((x.min() + 10 >= x).idxmax())))
df = df.loc[i]
print (df)
A B C
3 01:00:00 18 Fred
6 02:00:00 45 Emma
或者首先过滤掉每个组值较高的所有行,然后sort_values
列B
和最后drop_duplicates
保留最后一行:
df1 = df[df.groupby('A')['B'].transform('min') + 10 >= df['B']]
df1 = df1.sort_values('B').drop_duplicates('A', keep='last')
print (df1)
A B C
3 01:00:00 18 Fred
6 02:00:00 45 Emma