这是基于我以前的question。无论如何我也提供了这个问题的所有细节。
df = pd.DataFrame([[1,1,1,0,1],[2,1,1,0,1],[3,1,1,1,1],[4,0,1,0,1]])
df.columns = ['session','p1','p2','p3','p4']
df1 = df.set_index('session')
common = df1.dot(df1.T)
print common / np.sqrt(np.outer(*[df1.sum(1)] * 2))
session 1 2 3 4
session
1 1.000000 1.000000 0.866025 0.816497
2 1.000000 1.000000 0.866025 0.816497
3 0.866025 0.866025 1.000000 0.707107
4 0.816497 0.816497 0.707107 1.000000
现在我需要得到矩阵的上三角部分。
print np.triu(common / np.sqrt(np.outer(*[df1.sum(1)] * 2)))
输出:
[[ 1. 1. 0.8660254 0.81649658]
[ 0. 1. 0.8660254 0.81649658]
[ 0. 0. 1. 0.70710678]
[ 0. 0. 0. 1. ]]
我不需要对角线中的值,并且上侧的其余值需要对具有相同值的会话进行分组。例如,在前一种情况下,会话组就像是跟随。
session 1,3 and 2,3
session 1,4 and 2,4
session 3,4
session 1,2
答案 0 :(得分:1)
试试这个:
res = common / np.sqrt(np.outer(*[df1.sum(1)] * 2))
import itertools
for col in res.columns:
for _,g in res.groupby(col):
pairs = zip(list(g.index[g.index < col]),itertools.repeat(col))
if pairs: print pairs