Pandas 数据透视表 table - 增量列名称

Pandas Pivot table - incremental column names

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

我认为您需要 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

替代解决方案(它可能会更慢 - 我没有测试时间):

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