将数据帧列转换为计数器矩阵

pd *_*had 1 python numpy dataframe pandas

我有一个这样的数据框。发票转换为一个表,其中每行都有一个产品。该表由数百万行组成 -

发票 产品
INVC1 xx
INVC1 yy
INVC1 Z Z
INVC1
INVC2 xx
INVC2
INVC2 BB
INVC2 抄送

现在我想创建一个如下所示的表格,在其中我可以看到每种产品与其他产品一起购买的次数 -

xx yy Z Z BB 抄送
xx 0 1 1 2 1 1
yy 1 0 1 1 0 0
Z Z 1 1 0 1 0 0
2 1 1 0 1 1
BB 1 0 0 1 0 1
抄送 1 0 0 1 1 0

有没有 numpy/pandas 方法来创建这样的表?或者,有没有任何优化的方法来做到这一点。

WeN*_*Ben 6

pd.crosstab那么我们就用dot

s = pd.crosstab(df['invoice'],df['products'])
out = s.T.dot(s)
Out[196]: 
products  aa  bb  cc  xx  yy  zz
products                        
aa         2   1   1   2   1   1
bb         1   1   1   1   0   0
cc         1   1   1   1   0   0
xx         2   1   1   2   1   1
yy         1   0   0   1   1   1
zz         1   0   0   1   1   1
Run Code Online (Sandbox Code Playgroud)