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(如果您按多列分组)。
这可能是一个非常简单的问题,但我正在尝试了解分组和索引在 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(如果您按多列分组)。