return 行共享一个值并且至少有一个匹配另一个条件

return row that share a value and which have at least one matching another condition

我正在寻找一个优雅高效的解决方案。 我找到了一个快速而肮脏的解决方案。但我想知道是否有更多“pandas方式”可以做。

我有一个 pd 数据框:

Id   Value
T4    0.4
T5    0.3
T5    0.9
T5    1
T6    0.8
T7    0.2
T7    0.8

我想检索至少出现两次并且至少在一行中值 <= 0.4 的 ID。

此处预期输出为 [T5, T7]

目前,我的解决方案包括遍历 Id 的所有唯一值,创建一个子 df 并检查是否有超过 2 行,并且至少有一次值低于或等于 0.4

感谢任何帮助。

我找不到更有效的 built-in 函数,但这是我想出的:

counts = df['Id'].value_counts()
filtered = df[(df['Value'] <= 0.4) & ([counts[i] > 2 for i in df['id']])]

这可以通过 groupby 来完成:

g = df.groupby('Id')['Value']

df[g.transform('size').ge(2) & g.transform('min').le(0.4)]

输出:

   Id  Value
1  T5    0.3
2  T5    0.9
3  T5    1.0
5  T7    0.2
6  T7    0.8

如果你只需要Ids,我们可以这样做:

g = df.groupby('Id')['Value'].agg(['size','min'])
g.index[g['size'].ge(2) & g['min'].le(0.4)]

给出:

Index(['T5', 'T7'], dtype='object', name='Id')