在python中重塑数据框的问题:pivot和groupby不起作用

时间:2018-10-16 10:45:20

标签: python python-3.x pandas pivot pandas-groupby

我正在尝试重塑以下数据框:

            year    production     diversity
code_city           
10701       2007    1096895.118        97
10701       2008    1485981.356       101
10701       2009    1592737.910       110
10702       2007    1196895.116        95
10702       2008    1285981.355       102
10702       2009    1392737.913       111
10703       2007    1496895.112        92
10703       2008    1585981.351       105
10703       2009    1692737.916       116

,所需的输出是:

                         production    diversity    

10701       2007-12-31  1096895.118        97
            2008-12-31  1485981.356       101
            2009-12-31  1592737.910       110
10702       2007-12-31  1196895.116        95
            2008-12-31  1285981.355       102
            2009-12-31  1392737.913       111
10703       2007-12-31  1496895.112        92
            2008-12-31  1585981.351       105
            2009-12-31  1692737.916       116

我一直在使用它:

table = pd.pivot_table(df_firms1, index=['code_city', 'year'], columns=['production', 'diversity'])

但是我遇到很多错误。这是更好的方法吗?

1 个答案:

答案 0 :(得分:3)

第一个想法是使用reset_index

table = pd.pivot_table(df_firms1.reset_index(), 
                       index=['code_city', 'year'], 
                       columns=['production', 'diversity'])

但通过示例数据可以获得:

  

DataError:没有要聚合的数字类型

因此需要将year列转换为日期时间,然后将append=True的{​​{1}}和MultiIndex的参数set_index转换为rename_axis的索引名称:

df_firms1['year'] = pd.PeriodIndex(df_firms1['year'], freq='A').to_timestamp(how='e')

#alternative solution
#df_firms1['year'] = pd.to_datetime(df_firms1['year'], format='%Y') + pd.offsets.YearEnd()

df_firms1 = df_firms1.set_index('year', append=True).rename_axis([None, None])
print (df_firms1)

                   production  diversity
10701 2007-12-31  1096895.118         97
      2008-12-31  1485981.356        101
      2009-12-31  1592737.910        110
10702 2007-12-31  1196895.116         95
      2008-12-31  1285981.355        102
      2009-12-31  1392737.913        111
10703 2007-12-31  1496895.112         92
      2008-12-31  1585981.351        105
      2009-12-31  1692737.916        116