Python 熊猫groupby和reset#u索引如何更改数据帧';s指数?

Python 熊猫groupby和reset#u索引如何更改数据帧';s指数?,python,pandas,dataframe,Python,Pandas,Dataframe,有人能解释一下在数据帧上执行groupby(…).size()操作之后执行reset\u index(name='counts')操作时会发生什么吗?它完全符合我的要求(创建一个数据框,其中包含一列“counts”,该列具有每个组的大小),但我不明白为什么它可以工作 df=pd.DataFrame( {'letter':['A','A','B','B','C','number':[0,0,1,2,0]} ) 如果我执行groupby+size操作:df.groupby(['letter',num

有人能解释一下在数据帧上执行groupby(…).size()操作之后执行
reset\u index(name='counts')
操作时会发生什么吗?它完全符合我的要求(创建一个数据框,其中包含一列“counts”,该列具有每个组的大小),但我不明白为什么它可以工作

df=pd.DataFrame(
{'letter':['A','A','B','B','C','number':[0,0,1,2,0]}
)

如果我执行groupby+size操作:
df.groupby(['letter',number']).size()
,我会得到一个具有一个'letter'级别和一个'number'级别的多级索引:

df = df.groupby(['letter', 'number']).size()
print df.index
Out:MultiIndex(级别=[[u'A',u'B',u'C'],[0,1,2]],
标签=[[0,1,1,2],[0,1,2,0]],
姓名=[u'letter',u'number'])

我对添加
.reset\u index(…)
操作时会发生什么感到困惑:

df=df.groupby(['letter','number']).size().reset_index(name='counts')
,

它生成以下数据帧,其索引为RangeIndex(开始=0,停止=4,步骤=1):

我对三点特别困惑:

  • 的文档中没有一个名为“name”的关键字参数,但我看到许多帖子建议使用它创建一个命名的size/sum列,而且它似乎可以工作。是否有一些文档说明了这个
    name
    关键字参数是如何工作的
  • reset\u index
    之后的新数据帧有一个名为“counts”的列,但是
    reset\u index
    文档没有说明导致列命名的原因,那么这是如何发生的呢
  • 如果我们只指定了要删除的特定索引级别(“计数”),为什么整个多级索引会被重置

  • 你问题中的文字有点混乱。使用
    groupby
    时,需要为分组提供参数。您可能需要编辑。我想我仍然可以回答你的问题

    如果您按一件事分组,通常会得到一个
    系列
    作为
    .size()
    .count()
    的答案。您可以使用
    .index
    查看正在发生的事情:

    In [18]: df1 = pd.DataFrame({'letter':['A', 'A', 'B', 'B', 'C'], 'number':[0,0,1
        ...: ,2,0]})                                                                
    
    In [19]: df1                                                                    
    Out[19]: 
      letter  number
    0      A       0
    1      A       0
    2      B       1
    3      B       2
    4      C       0
    
    In [20]: df1.index                                                              
    Out[20]: RangeIndex(start=0, stop=5, step=1)
    
    In [21]: df1.groupby('letter').size()                                           
    Out[21]: 
    letter
    A    2
    B    2
    C    1
    dtype: int64
    
    In [22]: size_groups = _                                                        
    
    In [23]: size_groups.index                                                      
    Out[23]: Index(['A', 'B', 'C'], dtype='object', name='letter')
    
    In [24]: type(size_groups)                                                      
    Out[24]: pandas.core.series.Series
    
    这是一个系列,索引如上图所示。如果重置此索引,pandas将保留该系列,但添加一个新的索引系列,并将大小移到一个新系列,这将创建2个系列的数据帧:

    In [25]: size_groups.reset_index()                                              
    Out[25]: 
      letter  0
    0      A  2
    1      B  2
    2      C  1
    
    除非您使用
    groupby
    2种方法,否则无法从中获得多级索引。例如:

    In [43]: df1                                                                    
    Out[43]: 
      letter  number
    0      A       0
    1      A       0
    2      B       1
    3      B       2
    4      C       0
    
    In [44]: df2 = df1.groupby(['letter', 'number']).size()                         
    
    In [45]: df2                                                                    
    Out[45]: 
    letter  number
    A       0         2
    B       1         1
            2         1
    C       0         1
    dtype: int64
    
    In [46]: df2.index                                                              
    Out[46]: 
    MultiIndex([('A', 0),
                ('B', 1),
                ('B', 2),
                ('C', 0)],
               names=['letter', 'number'])
    

    谢谢你的解释。我编辑了我的问题,以便更清楚地说明我所说的是多列上的groupby,我主要对reset_index操作以及它如何与
    name
    关键字参数一起工作感到困惑。
    In [43]: df1                                                                    
    Out[43]: 
      letter  number
    0      A       0
    1      A       0
    2      B       1
    3      B       2
    4      C       0
    
    In [44]: df2 = df1.groupby(['letter', 'number']).size()                         
    
    In [45]: df2                                                                    
    Out[45]: 
    letter  number
    A       0         2
    B       1         1
            2         1
    C       0         1
    dtype: int64
    
    In [46]: df2.index                                                              
    Out[46]: 
    MultiIndex([('A', 0),
                ('B', 1),
                ('B', 2),
                ('C', 0)],
               names=['letter', 'number'])