gpt4 book ai didi

python - pandas groupby 和 reset_index 如何更改数据框的索引?

转载 作者:行者123 更新时间:2023-12-04 04:19:39 24 4
gpt4 key购买 nike

有人可以解释在对数据帧执行 groupby(...).size() 操作之后的 reset_index(name='counts') 操作期间发生了什么吗?它完全符合我的要求(创建一个数据框,其中有一列“计数”具有每个组的大小),但我不明白它为什么起作用。

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

如果我执行 groupby + size 操作:df.groupby(['letter', 'number']).size(),我会得到一个包含一个“字母”的多级索引级别和一个“数字”级别:

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

输出:MultiIndex(levels=[[u'A', u'B', u'C'], [0, 1, 2]],
标签=[[0, 1, 1, 2], [0, 1, 2, 0]],
names=[u'字母', u'数字'])

我对添加 .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. 如果我们只指定要删除的特定索引级别(“计数”),为什么整个多级索引会被重置?

最佳答案

您问题中的文字有点令人困惑。当您使用 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'])

关于python - pandas groupby 和 reset_index 如何更改数据框的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com