这是this question的第二部分。
假设我有一个dataframe df,我希望选择x1和x100,它们对应于按group_id分组的最大amount。如果有多行具有最大的amount,那么我希望选择x1和x100的中介。
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因此,所需的输出如下所示:
median_x1 median_x100
group_id
1 8.0 3.0
2 6.0 8.0
3 1.0 5.0对于只有2列(x1和x100),我只需在@AndrejKesely解决方案中添加1行到前面的问题,如下所示:
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列,即x1,x2到x100?理想情况下,我不希望复制一行100次并手动更改编辑器中列的名称.
发布于 2022-08-03 21:12:46
也许是这样的?
df.groupby('group_id').apply(
lambda x: x[x['amount'] == x['amount'].max()
].drop(columns=['amount', 'group_id']).median())您还可以使用列名代替.drop():
df.groupby('group_id').apply(
lambda x: x.loc[x['amount'] == x['amount'].max(), ['x1', 'x100']].median())https://stackoverflow.com/questions/73227675
复制相似问题