首页 > 解决方案 > 返回满足分组条件的行

问题描述

我有一个 pandas 数据框,raw_data我试图确定在第 2 天和第 4 天的每组时间中最大值发生的day位置。valueWell_IDDist < std

换句话说,如果Dist < std,返回每个观察到day最大值的位置以获得以下结果:valueWellID

raw_data看起来像:

井号 性病 价值
一个 3.2 8 1 282
一个 9.6 8 2 600
一个 4.1 8 3 56
一个 7.4 8 4 295
一个 12.0 8 5 312
2.3 10 1 203
4.7 10 2 212
18.1 10 3 365
3.5 10 4 202

是否可以像我在这里尝试做的那样将所有这些链接在一起?

final_data['peak_day'] = raw_data.groupby('Well_ID').agg(max('value')).where(raw_data['dist']<raw_data['std'])['Day']

您可以使用以下代码复制示例:

raw_data = pd.DataFrame({'WellID':['A','A','A','A','A','B','B','B','B'],
                         'Dist':[3.2,9.6,4.1,7.4,12,2.3,4.7,18.1,3.5],
                         'std':[8,8,8,8,8,10,10,10,10],
                         'day':[1,2,3,4,5,1,2,3,4],
                         'value':[282,600,56,295,312,203,212,365,202]})

标签: pythonpandaspandas-groupby

解决方案


由于您只对 where 行感兴趣Dist < std,因此我建议您在分组之前输入该条件。然后,您可以使用idxmax,它返回满足条件的索引。

# Declare mask because the name `raw_data` is too long for my liking
m = (raw_data['Dist'] < raw_data['std'])
# Get indices where condition is met
idx = raw_data[m].groupby('WellID')['value'].idxmax().values.tolist()
# Get the days of these indices
raw_data.iloc[idx][['WellID','day']]

  WellID  day
3      A    4
6      B    2

推荐阅读