根据计算对Pandas DataFrame中的值进行分组

时间:2014-02-03 10:05:04

标签: python pandas dataframe

这是基于我以前的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

1 个答案:

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