我正在尝试使用Pandas pivot_table将收据上的订单项作为列移动,每个收据只留一行。我的主要挑战是根据需要命名我的新列计数数字并填写NaN。
我正在努力做到这一点:
customer_id receipt_id item_id
01 100 420
05 400 450
05 400 460
05 400 320
05 400 270
02 300 320
02 300 460
05 200 220
......看起来像这样:
customer_id receipt_id 1 2 3 4 n..
01 100 420 NaN NaN NaN
05 400 450 460 320 270
02 300 320 460 NaN NaN
05 200 220 NaN NaN Nan
我一直在尝试让它发挥作用,但我并不亲近。
pt = pd.pivot_table(df, values=["item_id"], index=["customer_id", "receipt_id"], columns=["item_id"], fill_value="NaN").reset_index()
答案 0 :(得分:1)
我认为您需要cumcount
来创建列名并从参数[]
中删除values
:
df['g'] = df.groupby(['customer_id','receipt_id'])['item_id'].cumcount() + 1
pt = pd.pivot_table(df,
values="item_id",
index=["customer_id", "receipt_id"],
columns="g",
fill_value="NaN").reset_index()
print (pt)
g customer_id receipt_id 1 2 3 4
0 1 100 420 NaN NaN NaN
1 2 300 320 460 NaN NaN
2 5 200 220 NaN NaN NaN
3 5 400 450 460 320 270
答案 1 :(得分:1)
替代解决方案(可能更慢 - 我没有测试时间):
In [243]: df.groupby(['customer_id','receipt_id'])['item_id'].apply(list).apply(pd.Series).reset_index()
Out[243]:
customer_id receipt_id 0 1 2 3
0 1 100 420.0 NaN NaN NaN
1 2 300 320.0 460.0 NaN NaN
2 5 200 220.0 NaN NaN NaN
3 5 400 450.0 460.0 320.0 270.0