根据与键关联的多个行的值创建一列

时间:2018-10-27 23:17:51

标签: python pandas dataframe

我有一个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

1 个答案:

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

我很确定还有更优雅的解决方案,但是可以提供理想的输出。

如果您有大型数据集,则可能需要将groupbysort=False一起运行。