Python 3.x 如何使用所有列创建频率矩阵

Python 3.x 如何使用所有列创建频率矩阵,python-3.x,pandas,Python 3.x,Pandas,假设我有一个数据集,其中包含2行的4个二进制列 看起来是这样的: c1 c2 c3 c4 c5 r1 0 1 0 1 0 r2 1 1 1 1 0 我想创建一个矩阵,给出一列的出现次数,假设它也出现在另一列中。有点像混乱矩阵 我期望的输出是: c1 c2 c3 c4 c5 c1 - 1 1 1 0 c2 1 - 1 2 0 c3 1 1 - 1 0 c4 1 2 1 - 0 我使用了pandas交叉

假设我有一个数据集,其中包含2行的4个二进制列

看起来是这样的:

    c1 c2 c3 c4 c5
r1  0   1  0  1 0
r2  1   1  1  1 0
我想创建一个矩阵,给出一列的出现次数,假设它也出现在另一列中。有点像混乱矩阵

我期望的输出是:

   c1 c2  c3  c4 c5
c1  -  1   1   1  0
c2  1  -   1   2  0
c3  1  1   -   1  0
c4  1  2   1   -  0
我使用了pandas交叉表,但它仅在使用2列时提供所需的输出。我想使用所有列

dot
您可以使用
np.fill_diagonal
使对角线为零

d = df.T.dot(df)
np.fill_diagonal(d.to_numpy(), 0)
d

    c1  c2  c3  c4  c5
c1   0   1   1   1   0
c2   1   0   1   2   0
c3   1   1   0   1   0
c4   1   2   1   0   0
c5   0   0   0   0   0
只要我们使用Numpy,你就可以一直使用

a = df.to_numpy()
b = a.T @ a
np.fill_diagonal(b, 0)

pd.DataFrame(b, df.columns, df.columns)

    c1  c2  c3  c4  c5
c1   0   1   1   1   0
c2   1   0   1   2   0
c3   1   1   0   1   0
c4   1   2   1   0   0
c5   0   0   0   0   0

使用
melt
merge
groupby

s=df.reset_index().melt('index').loc[lambda x : x.value==1]
s.merge(s,on='index').query('variable_x!=variable_y').groupby(['variable_x','variable_y'])['value_x'].sum().unstack(fill_value=0)
Out[32]: 
variable_y  c1  c2  c3  c4
variable_x                
c1           0   1   1   1
c2           1   0   1   2
c3           1   1   0   1
c4           1   2   1   0
s=df.reset_index().melt('index').loc[lambda x : x.value==1]
s.merge(s,on='index').query('variable_x!=variable_y').groupby(['variable_x','variable_y'])['value_x'].sum().unstack(fill_value=0)
Out[32]: 
variable_y  c1  c2  c3  c4
variable_x                
c1           0   1   1   1
c2           1   0   1   2
c3           1   1   0   1
c4           1   2   1   0