首页 > 解决方案 > 熊猫数据框到数量总和的重复矩阵

问题描述

import pandas as pd
data = {0: {'ID': 'A', 'Qty': 1, 'Type': 'SVGA'},
 1: {'ID': 'B', 'Qty': 2, 'Type': 'SVGA'},
 2: {'ID': 'B', 'Qty': 2, 'Type': 'XGA'},
 3: {'ID': 'C', 'Qty': 3, 'Type': 'XGA'},
 4: {'ID': 'D', 'Qty': 4, 'Type': 'XGA'},
 5: {'ID': 'A', 'Qty': 1, 'Type': 'LED'},
 6: {'ID': 'C', 'Qty': 3, 'Type': 'LED'}}
df = pd.DataFrame.from_dict(data, orient='index')

是否可以将此数据框转换为总和的重复矩阵。

预期输出:

        LED  SVGA  XGA                
LED       4     1    3
SVGA      1     3    2
XGA       3     2    9

标签: pythonpandasdataframe

解决方案


这里的关键似乎是“ID”列,因为每个 Type-Type 单元格的值是根据这些类型是否共存于同一 ID 来计算的。

因此,从“ID”上的自合并开始。然后,您可以旋转您的结果以获取您的矩阵。

merge+crosstab

v = df.merge(df[['ID', 'Type']], on='ID') 
pd.crosstab(v.Type_x, v.Type_y, v.Qty, aggfunc='sum')

Type_y  LED  SVGA  XGA
Type_x                
LED       4     1    3
SVGA      1     3    2
XGA       3     2    9

merge+pivot_table

df.merge(df[['ID', 'Type']], on='ID').pivot_table(
    index='Type_x', columns='Type_y', values='Qty', aggfunc='sum'
)

Type_y  LED  SVGA  XGA
Type_x                
LED       4     1    3
SVGA      1     3    2
XGA       3     2    9

推荐阅读