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

Python 通过计算单元格中的值来计算共生矩阵,python,pandas,dataframe,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

我有一个这样的数据帧

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
v = df.values
pd.DataFrame(v.T.dot(v), index=df.columns, columns=df.columns)

或者,如果您希望在不增加pandas开销的情况下获得相同级别的性能,可以使用
np.dot
计算产品:

df.T.dot(df)
   a  b  c
a  2  1  0
b  1  2  1
c  0  1  2
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)


您似乎想要矩阵产品,因此利用
DataFrame.dot

df.T.dot(df)
   a  b  c
a  2  1  0
b  1  2  1
c  0  1  2
v = df.values
pd.DataFrame(v.T.dot(v), index=df.columns, columns=df.columns)

或者,如果您希望在不增加pandas开销的情况下获得相同级别的性能,可以使用
np.dot
计算产品:

df.T.dot(df)
   a  b  c
a  2  1  0
b  1  2  1
c  0  1  2
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)

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
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

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)

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)

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

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

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

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

爱它,艾因苏姆是一只很难驯服的野兽。爱它,艾因苏姆是一只很难驯服的野兽。很好,我也喜欢这个。可惜它只适用于3.5+版本!(brb,我已经达到每天的投票限制了…)很好,我也喜欢这个。可惜它只适用于3.5+版本!(brb,我已经达到了我的每日投票限制…
df.values.T@df.values
(lambda:a.T@a)(df.values)
@RafaelC yep,这与cold的回答非常相似:-)我可以知道投票被否决的原因吗?我的解决方案有问题吗?
df.values.T@df.values
(lambda:a.T@a)(df.values)
@RafaelC yep,这与cold的答案非常相似:-)我可以知道投反对票的原因吗?我的解决方案有问题吗?
(lambda,c:pd.DataFrame(a.T.dot(a),c,c))(df.values,df.columns)
@piRSquared哇,我在偷,呃,借用它。
(lambda,c:pd.DataFrame(a.T.dot(a),c,c))(df.values,df.columns)
@piRSquared哇,我在偷,呃,借用它。