将订单与列中的项目合并
Merge order with items in columns
我有一个包含所有订单、客户和订单项信息的数据集。我想在新列中扩展我的订单项目,但不会丢失有关客户的信息
CustomerId OrderId Item
1 1 CD
1 1 DVD
2 2 CD
结果应该是:
CustomerId OrderId CD DVD
1 1 1 1
2 2 1 0
我试过了
df2 = pd.concat([df, pd.get_dummies(df.Item)], axis='columns')
df2 = df2.groupby('CustomerId')
更简单的是 crosstab
;
pd.crosstab([df.CustomerId, df.OrderId], df.Item).reset_index()
CustomerId OrderId CD DVD
0 1 1 1 1
1 2 2 1 0
或者,pivot_table
如果性能很重要。
df.pivot_table(index=['CustomerId', 'OrderId'],
columns=['Item'],
aggfunc='size',
fill_value=0)
Item CD DVD
CustomerId OrderId
1 1 1 1
2 2 1 0
如果您想使用假人,str.get_dummies
是另一种选择:
# Solution similar to @jezrael but with str.get_dummies
(df.set_index(['CustomerId', 'OrderId'])
.Item.str.get_dummies()
.sum(level=[0, 1])
.reset_index())
CustomerId OrderId CD DVD
0 1 1 1 1
1 2 2 1 0
如果您需要指标,
(df.set_index(['CustomerId', 'OrderId'])
.Item.str.get_dummies()
.max(level=[0, 1])
.reset_index())
我有一个包含所有订单、客户和订单项信息的数据集。我想在新列中扩展我的订单项目,但不会丢失有关客户的信息
CustomerId OrderId Item
1 1 CD
1 1 DVD
2 2 CD
结果应该是:
CustomerId OrderId CD DVD
1 1 1 1
2 2 1 0
我试过了
df2 = pd.concat([df, pd.get_dummies(df.Item)], axis='columns')
df2 = df2.groupby('CustomerId')
更简单的是 crosstab
;
pd.crosstab([df.CustomerId, df.OrderId], df.Item).reset_index()
CustomerId OrderId CD DVD
0 1 1 1 1
1 2 2 1 0
或者,pivot_table
如果性能很重要。
df.pivot_table(index=['CustomerId', 'OrderId'],
columns=['Item'],
aggfunc='size',
fill_value=0)
Item CD DVD
CustomerId OrderId
1 1 1 1
2 2 1 0
如果您想使用假人,str.get_dummies
是另一种选择:
# Solution similar to @jezrael but with str.get_dummies
(df.set_index(['CustomerId', 'OrderId'])
.Item.str.get_dummies()
.sum(level=[0, 1])
.reset_index())
CustomerId OrderId CD DVD
0 1 1 1 1
1 2 2 1 0
如果您需要指标,
(df.set_index(['CustomerId', 'OrderId'])
.Item.str.get_dummies()
.max(level=[0, 1])
.reset_index())