在 Dataframe 中为每个组取下一个较低的值
Take the next lower value per each group in Dataframe
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
我想 select 每个 A
组一行,下一个条件:
- 取与最小值距离为10的行。例:在
02:00:00
组中,B
最小值为35
,所以取距离为(35+10=45)的行) B
值。
- 如果(最小值 + 10)不存在,取下一个较低的
B
值。示例:在 01:00:00
组中,最小值为 12,但它不存在 (12 + 10 = 22)。所以取下一个较低的B值,即18
.
输出应该是:
A B C
0 01:00:00 18 Fred
1 02:00:00 45 Emma
我试过了:
df[df.groupby('A')['B'].transform('min') + 10 <= df['B']]
将自定义 lambda 函数与 idxmax
一起用于 return 第一个最大行,同时将条件更改为 >
:
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
by column B
and last 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
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
我想 select 每个 A
组一行,下一个条件:
- 取与最小值距离为10的行。例:在
02:00:00
组中,B
最小值为35
,所以取距离为(35+10=45)的行)B
值。 - 如果(最小值 + 10)不存在,取下一个较低的
B
值。示例:在01:00:00
组中,最小值为 12,但它不存在 (12 + 10 = 22)。所以取下一个较低的B值,即18
.
输出应该是:
A B C
0 01:00:00 18 Fred
1 02:00:00 45 Emma
我试过了:
df[df.groupby('A')['B'].transform('min') + 10 <= df['B']]
将自定义 lambda 函数与 idxmax
一起用于 return 第一个最大行,同时将条件更改为 >
:
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
by column B
and last 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