python - 使用 pandas GroupBy 进行聚合时设置 MultiIndex
问题描述
一些练习要求在应用聚合函数时向 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 列分组并应用这样的 agg 函数时
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
?,以获得如下输出:
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')])
因此,您可以按应用 agg 函数的列和我们添加索引的列对 DF 进行排序
qty
MEDIAN
s_type d_type
s1 d1 1.7
s2 d1 2.5
d2 2.5
s1 d2 5.0
蟒蛇v3.6
熊猫 v0.23
谢谢你。
解决方案
超级简单。将“中位数”作为内部列表传递agg
:
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'])
您可以as_index=False
在调用 groupby 时指定,
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
因此,groupers 仍然是输出中的列。
您可以通过将元组列表传递给来更改输出中的名称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-3.x - 从列表索引中的每个字符串中提取首字母缩写词
- perforce - Deleted (not submitted) directory in Perforce: cannot revert, force-sync, reconcile or do anything else
- sql - 将字符串格式的日期转换为日期数据类型
- data-structures - 同一时期在这个城市的人数最多是多少?
- bash - 使用“ls -l”时,Windows 版 Cygwin 挂起
- azure-active-directory - Azure AD 身份验证通过 Auth0 失败
- javascript - create-react-app 子文件夹项目不 lint
- javascript - 是否有一种有效的方法可以使用其键访问数组中的对象?
- php - 为 JSONString Zoho inventory api 传递的值无效
- python-3.x - 从 pdf 中提取文本 - PyPDF2