pandas中的groupby和reset_index如何改变数据框的索引?

3
在对数据框进行 groupby(...).size() 操作之后执行 reset_index(name='counts') 操作会发生什么?它会按照分组的方式创建一个包含“counts”列的数据框,其中包含每个组的大小。虽然我不明白为什么它有效,但它确实实现了我想要的结果。
如果我执行 groupby + size 操作:df.groupby(['letter', 'number']).size(),我将获得一个多级索引,其中包含一个“letter”级别和一个“number”级别。
df = df.groupby(['letter', 'number']).size()
print df.index

输出: MultiIndex(levels=[[u'A', u'B', u'C'], [0, 1, 2]], labels=[[0, 1, 1, 2], [0, 1, 2, 0]], names=[u'letter', u'number'])

我对添加.reset_index(...)操作后会发生什么感到困惑:

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

这将产生索引为RangeIndex(start=0, stop=4, step=1)的以下Dataframe:

  letter  number  counts
0      A       0       2
1      B       1       1
2      B       2       1
3      C       0       1

我对以下三个问题特别困惑:

  1. reset_index的文档中没有名为"name"的关键字参数,但是我看到了一些帖子推荐使用它来创建一个命名的大小/总计列 [1, 2, 3] ,并且它似乎可以工作。有没有一些解释这个name关键字参数如何工作的文档?
  2. reset_index之后的新数据框具有名为“counts”的列,但是reset_index文档没有提到导致列被命名,那么这是怎么发生的?
  3. 为什么整个多级索引会被重置,如果我们只指定了要删除的特定索引级别(“counts”)?
1个回答

1

您问题中的文本有点混淆。当您使用groupby时,需要提供一个用于分组的参数。您可能希望进行编辑。我认为我仍然可以回答您的问题...

如果您按照一件事物进行分组,通常会得到series作为.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

你不能通过这种方式获得多级索引,除非你进行两个分组。例如:
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'])

感谢你的解释。我编辑了我的问题,让它更清楚我在谈论多列分组,并且我主要困惑于reset_index操作以及它如何与“name”关键字参数一起使用。 - charmander123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接