Pandas 分组后的索引行为:我看到 "extra row" 了吗?

Pandas indexing behavior after grouping: do I see an "extra row"?

这可能是一个非常简单的问题,但我正在尝试了解分组和索引在 pandas 中的工作原理。

假设我有一个包含以下数据的 DataFrame:

df = pd.DataFrame(data={
    'p_id': [1, 1, 1, 2, 3, 3, 3, 4, 4],
    'rating': [5, 3, 2, 2, 5, 1, 3, 4, 5]
})

现在,索引会自动分配,所以 DataFrame 看起来像:

      p_id    rating
0     1       5
1     1       3
2     1       2
3     2       2
4     3       5
5     3       1
6     3       3
7     4       4
8     4       5

当我尝试按 p_id 分组时,我得到:

>> df[['p_id', 'rating']].groupby('p_id').count()
           rating
p_id        
1          3
2          1
3          3
4          2

我注意到 p_id 现在成为分组 DataFrame 的索引,但第一行对我来说看起来很奇怪——为什么它有 p_id 索引评分为空?

我知道如何修复它,有点,如果我这样做:

>> df[['p_id', 'rating']].groupby('p_id', as_index=False).count()
      p_id    rating
0     1       3
1     2       1
2     3       3
3     4       2

现在我没有这个奇怪的第一列,但我有索引和 p_id

所以我的问题是,当我不使用 as_index=False 时,这个额外的行从哪里来,有没有办法对 DataFrame 进行分组并将 p_id 保留为索引而不必处理这个额外的行? 如果有任何我可以阅读的文档,那也将不胜感激。

这只是一个索引名称...

演示:

In [46]: df
Out[46]:
   p_id  rating
0     1       5
1     1       3
2     1       2
3     2       2
4     3       5
5     3       1
6     3       3
7     4       4
8     4       5

In [47]: df.index.name = 'AAA'

注意索引名称:AAA

In [48]: df
Out[48]:
     p_id  rating
AAA
0       1       5
1       1       3
2       1       2
3       2       2
4       3       5
5       3       1
6       3       3
7       4       4
8       4       5

您可以使用 rename_axis() 方法摆脱它:

In [42]: df[['p_id', 'rating']].groupby('p_id').count().rename_axis(None)
Out[42]:
   rating
1       3
2       1
3       3
4       2

没有“额外的行”,这只是 pandas 如何在视觉上呈现 GroupBy 对象,即 pandas.core.groupby.generic.DataFrameGroupBy.__str__ 方法如何呈现分组数据框对象: rating 是列,但是现在 p_id 已经从列变成了(行)索引。

他们将它们错开的另一个原因(即具有列名的行和具有 index/multi-index 名称的行)是因为索引可以是 MultiIndex(如果您按多列分组)。