【问题标题】:Pandas: how to convert a list into a matrix grouped by a column?Pandas:如何将列表转换为按列分组的矩阵?
【发布时间】:2017-06-08 02:19:47
【问题描述】:

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

我应该使用什么方法和参数?

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    自我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 的速度。这个问题的关键洞察是自合并。

    【讨论】:

    • 你是对的,使用 merge() 方法将数据框与自身合并,然后使用 crosstab() 将其转换为矩阵是我不知道的必需步骤。谢谢。
    猜你喜欢
    • 2015-04-30
    • 2016-08-26
    • 2022-11-16
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多