将月份列转换为行并聚合其下的其他列

Posted

技术标签:

【中文标题】将月份列转换为行并聚合其下的其他列【英文标题】:Convert month column into row and aggregate other columns under it 【发布时间】:2019-03-27 20:34:39 【问题描述】:

我有这样的数据

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 来完成这项工作,但我无法在月份标题下进行汇总。

我想先一步,将产品与每个月分开,求出每个月的利用率,例如:

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】:

使用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

【讨论】:

嗯,先生,你真棒! :)

以上是关于将月份列转换为行并聚合其下的其他列的主要内容,如果未能解决你的问题,请参考以下文章

将数据从多列转换为行并保留“标签”

在没有任何聚合函数的情况下将列数据转换为行

将月份和年份列转换为带有附加字符串连接的日期列

将日期列转换为周数、日期、月份、年份

R - 对连续变量标题进行分组,将分类变量因子作为行并聚合为最小值、最大值、平均值

将一列日期数字转换为缩写月份