重组数据框架

时间:2017-03-14 09:17:50

标签: python pandas dataframe

我有以下类型的日期框架:

|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     |...|   ...   |
 ...     ...       ...    ...   ...     ...    ...

如何快速有效地处理大量数据?

2 个答案:

答案 0 :(得分:2)

使用pivot_tableaggfunc="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)

enter image description here

它的等效groupby语法将计算分组列的总和,然后取消堆叠数据帧。接着按照上述方法进行类似的操作。

d1 = df.groupby(['user', 'product'])['quantity'].sum()
d1.unstack(fill_value=0).add_prefix("product_").rename_axis([None], axis=1)

enter image description here

答案 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