Python Pandas 构建完整的对比矩阵

Posted

技术标签:

【中文标题】Python Pandas 构建完整的对比矩阵【英文标题】:Python Pandas Building full matrix of contrasts 【发布时间】:2017-10-11 18:26:37 【问题描述】:

我有一个使用 Python Pandas 的特定查询。 为糟糕的介绍道歉

我有一个这样的 df

CG | T
------


    10   | 0.5   
    21   | 0.2  
    33   | 0.3  
    45   | 0.6

我想为 CG 构建所有可能的对比 就像

CG1 || CG2 || T1 || T2 || contrast||   
10 || 21 || 0.5 || 0.2 || 0.3 ||   
10 || 33 || 0.5 || 0.3 || 0.2 ||   
10 || 45 || 0.5 || 0.6 || -0.1 ||   
21 || 33 || 0.2 || 0.3 || -0.1 ||     
21 || 45|| 0.2 || 0.6  || -0.4 ||   
33 || 45 || 0.3 || 0.6 || -0.3 || 

我完成了一个循环,循环遍历所有行并合并回来 - 当数据变大时效率不高(n CG = 800) 我想知道 1) 是否有一种有效的方法来执行这样的循环或/和 2) 将 df 转换为这样的合同矩阵:

--- || 10 || 21 || 33 || 45 ||  
10 || 0.5 || 0.3 || 0.2 || -0.1 ||    
21 || 0.3 || 0.2 || -0.1 || -0.4 ||  
33 || 0.2 || -0.1 || 0.3 || -0.3 ||   
45|| -0.1 || -0.4 ||-0.3 || 0.6 ||

我已经阅读了几篇关于高效循环的文章——这个查询的特殊性在于我想在所有组之间建立对比(CG);这就像使用对角矩阵进行分层,并希望使用从对角元素中获取的差异填充所有非对角单元格(因此我的想法是使用矩阵)。

大家干杯!

【问题讨论】:

【参考方案1】:

这是一种使用分步初始化和分配的 NumPy 方法 -

n = a.shape[0]
r,c = np.triu_indices(n,1)
L = len(r)
out = np.empty((L,5))
out[:,:-1:2] = a[r]
out[:,1::2] = a[c]
out[:,-1] = out[:,2] - out[:,3]

样本输入、输出-

In [105]: a
Out[105]: 
array([[ 10. ,   0.5],
       [ 21. ,   0.2],
       [ 33. ,   0.3],
       [ 45. ,   0.6]])

In [106]: out
Out[106]: 
array([[ 10. ,  21. ,   0.5,   0.2,   0.3],
       [ 10. ,  33. ,   0.5,   0.3,   0.2],
       [ 10. ,  45. ,   0.5,   0.6,  -0.1],
       [ 21. ,  33. ,   0.2,   0.3,  -0.1],
       [ 21. ,  45. ,   0.2,   0.6,  -0.4],
       [ 33. ,  45. ,   0.3,   0.6,  -0.3]])

只有与pandas 数据帧接口的工作是使用a = df.values 获取输入数组a,其中df 是输入数据帧,然后使用建议的方法。最后,可以通过调用pd.Dataframe(out) 将输出转换为数据帧以获取输出数据帧。

【讨论】:

优秀的东西 Divakar - 我要测试一下!非常感谢! @MrT。如果可能的话,希望从您的实际数据集中获得一些加速数字。 现在运行!非常有效的一段代码 - 估计时间增益 ~ +50%。非常感谢迪瓦卡。干杯

以上是关于Python Pandas 构建完整的对比矩阵的主要内容,如果未能解决你的问题,请参考以下文章

Python构建关键词共现矩阵完整版

Python构建关键词共现矩阵完整版

Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战

在 python pandas 中构造一个共现矩阵

如何使用 PANDAS / Python 将矩阵转换为列数组

torch和numpy的对比