比方说,我有一个数据集,其中包含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 crosstab,但是当使用2列时,它只能提供所需的输出。我想使用所有列
答案 0 :(得分:6)
dot
df.T.dot(df)
# same as
# df.T @ df
c1 c2 c3 c4 c5
c1 1 1 1 1 0
c2 1 2 1 2 0
c3 1 1 1 1 0
c4 1 2 1 2 0
c5 0 0 0 0 0
您可以使用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
答案 1 :(得分:3)
将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