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

时间:2015-12-06 02:12:25

标签: python pandas

我是一个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

我想创建一个新的数据帧,上面的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 个答案:

答案 0 :(得分:1)

编辑:让我们看看你喜欢这个!

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 method

应该是这样的:

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

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

请告诉我这是否适合您!

答案 1 :(得分:1)

最后,我想出了什么似乎是一个有效的解决方案。我意识到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

我不知道这是否是最佳解决方案。仍然欢迎更好的想法。