Python Pandas,将groupby()组标签设置为新数据框中的索引

5

我是一名Python编程初学者,试图弄清楚如何将groupby操作的分组标签用作新数据框的索引。 例如,

df = pd.DataFrame({'Country': ['USA', 'USA', 'UK', 'China', 'Canada', 'Australia', 'UK', 'China', 'USA'],
            'Year': [1979, 1983, 1987, 1991, 1995, 1999, 2003, 2007, 2011],
            'Medals': [52, 30, 25, 41, 19, 17, 9, 14, 12]})

df:
         Country  Medals  Year
    0        USA      52  1979
    1        USA      30  1983
    2         UK      25  1987
    3      China      41  1991
    4     Canada      19  1995
    5  Australia      17  1999
    6         UK       9  2003
    7      China      14  2007
    8        USA      12  2011

 c1 = df.groupby(df['Country'], as_index=True, sort=False, group_keys=True).size()

c1:
Country
USA          3
UK           2
China        2
Canada       1
Australia    1

我想要创建一个新的dataframe,其中包含上述c1结果严格按照该格式排列,但我一直没有成功。以下是我的输出结果:
d1 = pd.DataFrame(np.array(c1), columns=['Frequency'])
d1:
   Frequency
0          3
1          2
2          2
3          1
4          1

我希望将组标签作为索引,而不是默认的0、1、2、3和4。

这正是我想要的:

Desired Output:
            Frequency
USA             3
UK              2
China           2
Canada          1
Australia       1

请问我该如何实现这个功能?我猜如果我创建一个带有国家名称的标签,并将其分配为索引,可能会起作用。但是,我正在练习使用的原始数据有很多行,我无法创建一个标签列表。如果您有任何想法,将不胜感激。

2个回答

2

编辑:让我们看看你对这个的喜欢程度!

c1 = pd.DataFrame(c1.values, index=c1.index.values, columns=['Frequency'])
print(c1)

    Frequency
USA         3
UK          2
China       2
Canada      1
Australia   1
c1.values大致上等同于np.array(c1),但不需要导入numpy库,这对于我们的目的来说很方便。

原始响应(不完全可行,保留以备之需):你可能正在寻找set_index 方法

它应该像这样工作:

c1 = df.groupby(df['Country'], as_index=True, sort=False, group_keys=True).size()

c2 = c1.set_index(['Country'])

如果这对您有用,请告诉我!


谢谢Josh。我运行了它,但是出现了这个错误。(type(self).name, name)) AttributeError: 'Series'对象没有'set_index'属性。 - Okechukwu Ossai
谢谢Josh。c1.values起作用了。然而,set_index方法仍然显示之前的错误信息。 - Okechukwu Ossai
追溯(最近的)调用: 文件“C:/Users/test.py”,第463行,在<module>中: c2 = c1.set_index(['Country']) 文件“C:\Users\Anaconda3\lib\site-packages\pandas\core\generic.py”,第2360行,__getattr__函数: (type(self).__name__,name)) 属性错误:'Series'对象没有'set_index'属性。 - Okechukwu Ossai
抱歉,我应该表达得更清楚。如果您设置 c1 = pd.DataFrame(c1.values, index=c1.index.values, columns=['Frequency']),则不再需要使用 set_index。 - Josh Rumbut
感谢Josh的帮助。 - Okechukwu Ossai
显示剩余2条评论

2

最终,我找到了一个看起来可行的解决方案。我意识到c1是一个系列而不是数据框,具有可通过c1.index调用的索引。因此,我通过指定索引来改进代码;

d1 = pd.DataFrame(np.array(c1), index=c1.index, columns=['Frequency'])

d1:

           Frequency
Country             
USA                3
UK                 2
China              2
Canada             1
Australia          1

我不确定这是否是最佳解决方案。如果有更好的想法欢迎提出。


1
嘿,看看我的修改,与你想出的差不多,只是它摆脱了那个麻烦的“国家”。而且没有使用numpy :) - Josh Rumbut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接