选择具有条件列值的行

领带_24
            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选择一行,并具有以下条件:

  • 选择“最小 C 列值 + 10”
  • 如果它不存在“最小 C 列值 + 10”,则取下一个C 列值

输出应该是:

            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_valuesdrop_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章