通过计算单元格中的值来计算共生矩阵

时间:2018-05-10 18:34:00

标签: python pandas dataframe

我有一个像这样的数据框

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)

但我认为有一个更简单的解决方案,不是吗?

4 个答案:

答案 0 :(得分:15)

您似乎想要矩阵产品,因此请使用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

—piRSquared

答案 1 :(得分:10)

np.einsum

不如df.T.dot(df)那么漂亮,但您经常看到np.einsum amirite?

pd.DataFrame(np.einsum('ij,ik->jk', df, df), df.columns, df.columns)

   a  b  c
a  2  1  0
b  1  2  1
c  0  1  2

答案 2 :(得分:7)

您可以使用@运算符对numpy数组进行乘法运算。

df = pd.DataFrame(df.values.T @ df.values, df.columns, df.columns)

答案 3 :(得分:3)

Numpy matmul

np.matmul(df.values.T,df.values)
Out[87]: 
array([[2, 1, 0],
       [1, 2, 1],
       [0, 1, 2]], dtype=int64)

#pd.DataFrame(np.matmul(df.values.T,df.values), df.columns, df.columns)