熊猫:如何将列表转换为按列分组的矩阵?

时间:2017-06-07 17:47:30

标签: python pandas numpy

我有一个pandas数据框,其中第一列(CUSTOMER)是客户的名称,客户购买的每件产品(PRODUCT)都会重复一次客户名称:

Customer  Product  Count
John      A        1
John      B        1
John      C        1
Mary      A        1
Mary      B        1
Charles   A        1

我想透过此数据来创建一个新的数据框,其中行和列都是产品类别(PRODUCT),值是客户名称的计数,如下所示:

Product
       A     B     C
A      0     2     1
B      2     0     1
C      1     1     0

因此,如果约翰买了A并且还买了B,+1会加到A:B小区,他也买了A和C一起,所以A:C小区有+1,依此类推。请注意,Charles并未出现在此数据框中,因为他只购买了一种产品。

我尝试使用pandas.pivot_table,但这就是我得到的:

df = pd.pivot_table(df, index=['Product'], columns=['Product'], values=['Customer'])

>> KeyError: 'Level Product not found'

我应该使用哪种方法和参数?

1 个答案:

答案 0 :(得分:6)

mergecrosstab

d1 = df.merge(df, on='Customer').query('Product_x != Product_y')
pd.crosstab(d1.Product_x, d1.Product_y)

Product_y  A  B  C
Product_x         
A          0  2  1
B          2  0  1
C          1  1  0

您可以看到this answer以更好地了解如何加快crosstab的速度。这个问题的关键见解是自我合并。