簡體   English   中英

pandas groupby 和 reset_index 如何更改數據幀的索引?

[英]How does pandas groupby and reset_index change the dataframe's index?

有人可以解釋在對數據幀執行 groupby(...).size() 操作之后的reset_index(name='counts')操作期間會發生什么嗎? 它完全符合我的要求(創建一個包含每個組大小的“計數”列的數據框),但我不明白它為什么起作用。

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

如果我執行 groupby + size 操作: df.groupby(['letter', 'number']).size() ,我會得到一個具有一個“字母”級別和一個“數字”級別的多級索引:

df = df.groupby(['letter', 'number']).size()
print df.index

Out: 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)

  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之后的新數據reset_index有一個名為 'counts' 的列,但是reset_index文檔沒有說明導致列被命名的任何內容,那么這是怎么發生的呢?
  3. 如果我們只指定要刪除的特定索引級別(“計數”),為什么整個多級索引會被重置?

您問題中的文字有點令人困惑。 當您使用groupby您需要為分組提供一個參數。 您可能想要編輯。 我想我仍然可以回答你的問題...

如果你分組 1 個東西,你通常會得到一個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

除非您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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM