我有以下类型的日期框架:
|user|product|quantity|
|1 | 1 | 4 |
|1 | 1 | 3 |
|1 | 2 | 1 |
|2 | 1 | 5 |
|2 | 1 | 8 |
|2 | 5 | 7 |
... ... ...
我想获得下一种日期框架:
|user|product_1|product_2|...|product_5|...|product_n|
|1 | 7 | 1 |...| 0 |...| 0 |
|2 | 13 | 0 |...| 7 |...| ... |
... ... ... ... ... ... ...
如何快速有效地处理大量数据?
答案 0 :(得分:2)
使用pivot_table
与aggfunc="sum"
一起将数据帧从长格式重新整形为宽格式。发布,在add_prefix
选项的帮助下格式化列名。
d = df.pivot_table(index='user', columns='product',
values='quantity', aggfunc='sum', fill_value=0)
d.add_prefix("product_").rename_axis([None], axis=1)
它的等效groupby
语法将计算分组列的总和,然后取消堆叠数据帧。接着按照上述方法进行类似的操作。
d1 = df.groupby(['user', 'product'])['quantity'].sum()
d1.unstack(fill_value=0).add_prefix("product_").rename_axis([None], axis=1)
答案 1 :(得分:1)
试试pd.DataFrame.unstack()
。这正是你想要的。
更新:我想延长这个答案,但由于现在会议太晚了,另一个答案是好的。但是,到目前为止(假设您每个用户产品只有一个数字,因此不需要groupby):
df = df.set_index(['user', 'product'])
df = df.unstack(-1).fillna(0) # only if you want to fill the NaNs