如何在python中透视数据框

时间:2018-05-20 20:52:18

标签: python python-3.x pandas dataframe

我有以下数据框:

week           Country         Year   Value   category  
1               Angola          2005    6       A  
1               Angola          2005    13      A  
1               Angola          2005    10      B  
1               Angola          2005    11      C  
1               Angola          2005    5       D  
1               Angola          2006    3       A  
1               Angola          2006    2       B  
1               Angola          2006    7       C  
1               Angola          2006    3       D  
1               Angola          2006    6       E  
2               Angola          2006    3       A  
2               Angola          2006    2       B  
2               Angola          2006    7       C  
2               Angola          2006    3       D  

我希望上面的数据框在每年按周分组,并在python中准备一个透视图,给出下面的数据框。对于不同的国家,相同的数据会继续存在,并且可能会添加不同的类别,如果任何国家/地区都有新类别,则应将该类别添加到数据框中,并在该数据框中包含相应的值。

week      Country         year    category_A   Category_B     category_C category_D    Category_E
1           Angola         2005       19            10              11           5          0
1           Angola         2006       3             2               7           3           6
2           Angola         2006       3             2               7           3           0

2 个答案:

答案 0 :(得分:3)

这是一种方式。请注意,如果您需要索引作为列,则可以使用reset_index。您可能还希望将类别列重命名为单独的步骤。

res = df.pivot_table(index=['week', 'Country', 'Year'], columns=['category'],
                     values='Value', aggfunc=np.sum, fill_value=0)

print(res)

category            A   B   C  D  E
week Country Year                  
1    Angola  2005  19  10  11  5  0
             2006   3   2   7  3  6
2    Angola  2006   3   2   7  3  0

答案 1 :(得分:2)

在这种情况下,您还可以使用groupby代替pivot

(df.groupby(['week', 'Year', 'Country', 'category'])
 .sum()
 .unstack(fill_value=0)
 .add_prefix('category_'))

这给了你:

                  category_Value                                            
category              category_A category_B category_C category_D category_E
week Year Country                                                           
1    2005 Angola              19         10         11          5          0
     2006 Angola               3          2          7          3          6
2    2006 Angola               3          2          7          3          0