Python 熊猫groupby和reset#u索引如何更改数据帧';s指数?
有人能解释一下在数据帧上执行groupby(…).size()操作之后执行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
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
关键字参数是如何工作的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'])