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')
我正在寻找一个优雅高效的解决方案。 我找到了一个快速而肮脏的解决方案。但我想知道是否有更多“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')