将月份列转换为行并汇总其下的其他列

时间:2018-10-23 14:43:03

标签: python pandas logic pivot-table pandas-groupby

我有这样的数据

user    product     month
 A       1011         2
 B       2011         2
 B       2034         3
 C       2078         4
 D       1098         1
 A       9087         3
 A       5017         4
 D       1872         1
 A       1011         4

以此类推

我想聚合这些数据,以便将月份列转换为行,因为它们成为标题,并且我可以聚合每个用户下具有唯一值的“产品”以及访问它们的月份。所以输出应该是这样的

user   product  1  2  3  4  5  6  7  8  9  10  11  12
 A       3      0  1  1  2  0  0  0  0  0   0   0   0
 B       2      0  1  1  0  0  0  0  0  0   0   0   0
 C       1      0  0  0  1  0  0  0  0  0   0   0   0
 D       2      2  0  0  0  0  0  0  0  0   0   0   0

我认为我可以使用Pivot完成此操作,但是我不能在month标题下进行汇总。

我想走得更远,将产品与每个月相除,以找出每个月的利用率,例如:

user   product  1   2     3     4     5  6  7  8  9  10  11  12
 A       3      0  0.33  0.33   0.66  0  0  0  0  0   0   0   0
 B       2      0  0.50  0.50    0    0  0  0  0  0   0   0   0
 C       1      0   0     0      1    0  0  0  0  0   0   0   0
 D       2      1   0     0      0    0  0  0  0  0   0   0   0

1 个答案:

答案 0 :(得分:1)

使用groupby + nunqiue获取前两列,然后使用get_dummies获取其他列

s1=df.groupby('user').product.nunique()
s2=df.set_index('user').month.astype(str).str.get_dummies().sum(level=0)
pd.concat([s1,s2.div(s1,axis=0)],1)
Out[121]: 
      product    1         2         3         4
user                                            
A           3  0.0  0.333333  0.333333  0.666667
B           2  0.0  0.500000  0.500000  0.000000
C           1  0.0  0.000000  0.000000  1.000000
D           2  1.0  0.000000  0.000000  0.000000