Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用GroupBy进行聚合时设置多索引_Python_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

Python 使用GroupBy进行聚合时设置多索引

Python 使用GroupBy进行聚合时设置多索引,python,python-3.x,pandas,pandas-groupby,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

一些练习要求在应用聚合函数时向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'})
并进行打印(新的_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
也 为什么数量上移1行?(我正在使用Spyder,我在Anaconda/python控制台中也看到了这一点,不确定这是一个功能还是正常行为)

最后一次更新:如果需要使用sort\u值,则必须为添加二级索引/名称的列使用元组,这与应用聚合函数时的方式基本相同(请参见答案)

因此,您可以按照应用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

谢谢。

超级简单。将“中间值”作为列表传递到
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
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

至于“为什么数量上移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时将
指定为_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
,可以更改输出中的名称:

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