某些锻炼要求在应用聚合函数时向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控制台中看到了这一点,不确定它是否像功能或熊猫的正常行为。)
最后一次更新::如果需要使用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
python v3.6
熊猫v0.23
谢谢。
答案 0 :(得分:2)
超级简单。将“中位数”作为列表传递到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
“为什么数量要上升1行”,这意味着前两列实际上是输出中的 index 。查询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