这可能是一个非常简单的问题,但我试图了解分组和索引在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作为索引,而不必处理这个额外的行?如果有任何我可以阅读的文档,那也将非常感激。
由于
答案 0 :(得分:2)
它只是一个索引名称......
演示:
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
答案 1 :(得分:0)
没有“多余的行” ,这只是熊猫如何直观地呈现GroupBy对象,即pandas.core.groupby.generic.DataFrameGroupBy.__str__
方法如何呈现分组的数据框对象:rating
是列,但是现在p_id
已经从列变成了(行)索引。
它们错开它们的另一个原因是因为索引可以是MultiIndex(如果您按多列分组)。