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使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战