![](/img/trans.png)
[英]Pandas dataframe issue: `reset_index` does not remove hierarchical 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
我对三点特别困惑:
name
关键字参数的工作原理?reset_index
之后的新数据reset_index
有一个名为 'counts' 的列,但是reset_index
文档没有说明导致列被命名的任何内容,那么这是怎么发生的呢?您问题中的文字有点令人困惑。 当您使用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.