python - 通过计算单元格中的值来计算共现矩阵
问题描述
我有一个这样的数据框
df = pd.DataFrame({'a' : [1,1,0,0], 'b': [0,1,1,0], 'c': [0,0,1,1]})
我想得到
a b c
a 2 1 0
b 1 2 1
c 0 1 2
其中 a,b,c 是列名,当过滤器在另一列中为“1”时,我得到的值在所有列中计数为“1”。例如,当 df.a == 1 时,我们计算 a = 2、b =1、c = 0 等
我做了一个循环来解决
matrix = []
for name, values in df.iteritems():
matrix.append(pd.DataFrame( df.groupby(name, as_index=False).apply(lambda x: x[x == 1].count())).values.tolist()[1])
pd.DataFrame(matrix)
但我认为有一个更简单的解决方案,不是吗?
解决方案
您似乎想要矩阵产品,所以利用DataFrame.dot
:
df.T.dot(df)
a b c
a 2 1 0
b 1 2 1
c 0 1 2
或者,如果您想要在没有 pandas 开销的情况下获得相同水平的性能,您可以使用以下方法计算乘积np.dot
:
v = df.values
pd.DataFrame(v.T.dot(v), index=df.columns, columns=df.columns)
或者,如果你想变得可爱,
(lambda a, c: pd.DataFrame(a.T.dot(a), c, c))(df.values, df.columns)
a b c
a 2 1 0
b 1 2 1
c 0 1 2