首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫按x分组,按y排序,选择z,在出现多个最大值时聚合,多列

熊猫按x分组,按y排序,选择z,在出现多个最大值时聚合,多列
EN

Stack Overflow用户
提问于 2022-08-03 20:50:42
回答 1查看 20关注 0票数 0

这是this question的第二部分。

假设我有一个dataframe df,我希望选择x1x100,它们对应于按group_id分组的最大amount。如果有多行具有最大的amount,那么我希望选择x1x100的中介。

代码语言:javascript
复制
df = pd.DataFrame({'group_id' : [1,1,1,2,2,3,3,3,3],
                   'amount'  : [2,4,5,1,2,3,5,5,5],
                   'x1':[2,5,8,3,6,9,3,1,0],
                  'x100':[1,2,3,4,8,9,9,4,5]})

   group_id  amount  x1  x100
0         1       2   2     1
1         1       4   5     2
2         1       5   8     3
3         2       1   3     4
4         2       2   6     8
5         3       3   9     9
6         3       5   3     9
7         3       5   1     4
8         3       5   0     5

因此,所需的输出如下所示:

代码语言:javascript
复制
          median_x1  median_x100
group_id                        
1               8.0          3.0
2               6.0          8.0
3               1.0          5.0

对于只有2列(x1x100),我只需在@AndrejKesely解决方案中添加1行到前面的问题,如下所示:

代码语言:javascript
复制
out = df.groupby("group_id").apply(
    lambda x: pd.Series(
        {"median_x1": (d := x.loc[x["amount"] == x["amount"].max()])['x1'].median(),
         "median_x100": d["x100"].median()}
    )
)

如何以一种整洁的方式完成这一工作,这将工作100列,即x1x2x100?理想情况下,我不希望复制一行100次并手动更改编辑器中列的名称.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-03 21:12:46

也许是这样的?

代码语言:javascript
复制
df.groupby('group_id').apply(
    lambda x: x[x['amount'] == x['amount'].max()
               ].drop(columns=['amount', 'group_id']).median())

您还可以使用列名代替.drop():

代码语言:javascript
复制
df.groupby('group_id').apply(
    lambda x: x.loc[x['amount'] == x['amount'].max(), ['x1', 'x100']].median())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73227675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档