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