Pandas Pivot表 - 增量列名

时间:2016-06-22 19:21:43

标签: python pandas dataframe pivot-table dynamic-columns

我正在尝试使用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()

2 个答案:

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