gpt4 book ai didi

python - 使用 pandas GroupBy 聚合时设置 MultiIndex

转载 作者:太空宇宙 更新时间:2023-11-04 01:57:13 28 4
gpt4 key购买 nike

一些练习要求在应用聚合函数时向 df 列“添加辅助名称”。

给定以下 DF:

stype = ['s1','s1','s1','s1',
's2','s2','s2','s2']
dtype = ['d1','d1','d2','d2',
'd1','d1','d2','d2']
qty = [2, 1.4, 7, 3,
4, 1, 2.0, 3]
df = pd.DataFrame({'s_type':stype,
'd_type':dtype,
'qty':qty})

当按前 2 列分组并应用这样的聚合函数时

new_df=df.groupby(['s_type','d_type'],sort =  False).agg({'qty':'median'})

然后打印(new_df)

我得到这个输出,注意 qty 向上移动了一行(我假设这是正常行为)因为是应用了 agg 函数的一列

               qty
s_type d_type
s1 d1 1.7
d2 5.0
s2 d1 2.5
d2 2.5

问题是什么

是否可以在 qty label/name 下设置辅助列名称?,以获得如下输出:

               qty
s_type d_type Median
s1 d1 1.7
d2 5.0
s2 d1 2.5
d2 2.5

还有为什么 qty 向上移动 1 行? (我正在使用 Spyder,我也在 Anaconda/python 控制台中看到了这一点,不确定它是否像一个功能或 pandas 的正常行为)。

上次更新:如果您需要使用 sort_values,则必须为您添加二级索引/名称的列使用元组,这与应用聚合函数时的方式几乎相同(查看答案)

new_df=new_df.sort_values([('qty','MEDIAN')])

因此,您得到的 DF 按应用聚合函数的列和我们添加索引的列排序

                 qty
MEDIAN
s_type d_type
s1 d1 1.7
s2 d1 2.5
d2 2.5
s1 d2 5.0

python v3.6

Pandas v0.23

谢谢。

最佳答案

super 简单。在 agg 中将“median”作为列表传递:

result = df.groupby(['s_type','d_type'], sort=False).agg({'qty': ['median']})
result
qty
median
s_type d_type
s1 d1 1.7
d2 5.0
s2 d1 2.5
d2 2.5

至于“为什么 qty 向上移动 1 行”,这意味着前两列实际上是输出中的索引。查询 result.index 会很明显:​​

result.index

MultiIndex(levels=[['s1', 's2'], ['d1', 'd2']],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['s_type', 'd_type'])

您可以在调用 groupby 时指定 as_index=False

df.groupby(['s_type','d_type'], sort=False, as_index=False).agg({'qty': ['median']})

s_type d_type qty
median
0 s1 d1 1.7
1 s1 d2 5.0
2 s2 d1 2.5
3 s2 d2 2.5

所以石斑鱼在输出中保留列。


您可以通过将元组列表传递给 agg 来更改输出中的名称:

df.groupby(['s_type','d_type'], sort=False).agg(
{'qty': [('MEDIAN', 'median')]}
)

qty
MEDIAN
s_type d_type
s1 d1 1.7
d2 5.0
s2 d1 2.5
d2 2.5

关于python - 使用 pandas GroupBy 聚合时设置 MultiIndex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56546585/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com