使用pandas GroupBy

时间:2019-06-11 14:59:54

标签: python python-3.x pandas pandas-groupby

某些锻炼要求在应用聚合函数时向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

谢谢。

1 个答案:

答案 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