我有一个DataFrame,其中包含客户和他们购物的类别,我想知道客户是否是跨类别购物者(只有三个类别)。改变这种状况的最佳方法是什么?
Customer Category
foo A
foo B
boo A
zoo C
对此:
Customer A B C CrossCategory
foo Y Y N True
boo Y N N False
zoo N N Y False
答案 0 :(得分:2)
如果您只对CrossCategory
列感兴趣,可以使用:
df.groupby('Customer')['Category'].nunique() > 1
给出
Customer
boo False
foo True
zoo False
Name: Category, dtype: bool
对于pivot
部分:
您可以添加另一列:
df['visited'] = 'Y'
然后使用pivot
p = df.pivot(index='Customer', columns='Category', values='visited').fillna('N')
Category A B C
Customer
boo Y N N
foo Y Y N
zoo N N Y
然后,我们使用第二种方法来获取CrossCategory
列
# alternative approach to the nunique part from above
df['CrossCategory'] = df.groupby('Customer')['Category'].transform('size') > 1
Customer Category visited CrossCategory
0 foo A Y True
1 foo B Y True
2 boo A Y False
3 zoo C Y False
最后将两个数据帧连接起来
pd.concat([p, df[['Customer', 'CrossCategory']].drop_duplicates().set_index('Customer')], sort=False, axis=1)
结果是:
A B C CrossCategory
boo Y N N False
foo Y Y N True
zoo N N Y False
我很确定还有更优雅的解决方案,但是可以提供理想的输出。
如果您有大型数据集,则可能需要将groupby
与sort=False
一起运行。