A B C
0 2002-01-13 15:00:00 120
1 2002-01-13 15:30:00 110
2 2002-01-13 16:00:00 130
3 2002-01-13 16:30:00 140
4 2002-01-14 15:00:00 180
5 2002-01-14 15:30:00 165
6 2002-01-14 16:00:00 150
7 2002-01-14 16:30:00 170
我想为每个A group选择一行,并具有以下条件:
输出应该是:
A B C
0 2002-01-13 15:00:00 120
5 2002-01-14 15:30:00 165
正如@Anton vBR 所评论的那样,首先按每个组的条件删除行,然后通过最小的C
方式获取行idxmax
并选择loc
:
df = df[df.groupby('A')['C'].transform(lambda x: x >= x.min() + 10)]
#filtering with transform `min` only
#df = df[df.groupby('A')['C'].transform('min') + 10 <= df['C']]
print (df)
A B C
0 2002-01-13 15:00:00 120
2 2002-01-13 16:00:00 130
3 2002-01-13 16:30:00 140
4 2002-01-14 15:00:00 180
5 2002-01-14 15:30:00 165
7 2002-01-14 16:30:00 170
df = df.loc[df.groupby('A')['C'].idxmin()]
什么是相同的:
idx=df.sort_values(['A','C']).groupby('A')['C'].apply(lambda x: (x >= x.min() + 10).idxmax())
df = df.loc[idx]
与替代解决方案sort_values
有drop_duplicates
:
df = df.sort_values(['A','C'])
df = df[df.groupby('A')['C'].transform(lambda x: x >= x.min() + 10)].drop_duplicates(['A'])
print (df)
A B C
0 2002-01-13 15:00:00 120
5 2002-01-14 15:30:00 165
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句