我所拥有的是四列矩阵。我想保留前两列并将最后两列转换为一种出现矩阵(但具有相应的值)。我试图通过[' shop_id',' item_id',' date']进行分组,但不知道如何为那些空白日期填写0。有人有想法吗?非常感谢
given:
shop_id item_id date sales
0 19 0 1
0 19 2 13
0 19 3 11
1 19 1 3
result:
shop_id item_id date_0 date_1 date_2 date_3
0 19 1 0 13 11
1 19 0 3 0 0
答案 0 :(得分:2)
让我们使用set_index
,unstack
和fillna
:
df.set_index(['shop_id','item_id','date'])['sales'].unstack()\
.add_prefix('date_').reset_index().fillna(0).astype(int)
输出:
date shop_id item_id date_0 date_1 date_2 date_3
0 0 19 1 0 13 11
1 1 19 0 3 0 0
答案 1 :(得分:2)
使用defaultdict
import pandas as pd
from collections import defaultdict
d = defaultdict(dict)
for (shop, item, date, sales) in df.values.tolist():
d[date][(shop, item)] = sales
pd.DataFrame(d).fillna(0, downcast='infer') \
.add_prefix('date_').rename_axis(['shop_id', 'item_id']).reset_index()
shop_id item_id date_0 date_1 date_2 date_3
0 0 19 1 0 13 11
1 1 19 0 3 0 0
答案 2 :(得分:1)
这是一个pivot_table
解决方案,应该非常快 -
df = df.pivot_table(
index=['shop_id', 'item_id'],
columns=['date'],
values=['sales'],
fill_value=0)\
.add_prefix('date_').reset_index()
df
shop_id item_id date_sales
date date_0 date_1 date_2 date_3
0 0 19 1 0 13 11
1 1 19 0 3 0 0
在决定使用哪种解决方案之前,请确保在数据上测试两种解决方案!