Python-Matrix的两个变量之和取决于第三个变量



我试图分析阈值函数中两个变量的演变。我从一个数据帧开始,比如:

list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)
raw.head()

threshold   var_1   var_2
0        6       3
100        6       1
200        4       1
300        3       0
400        3       0 

目标是表示两个变量的总和,这取决于阈值,如下所示,用于热图:

500 3   1   1   0   0   0
400 5   3   3   2   2   2
var_1   300 6   4   4   3   3   3
200 7   5   5   4   4   4
100 9   7   7   6   6   6
0 9   7   7   6   6   6
0   100 200 300 400 500
var_2             

我试过corrstab和pivot_table,但没有得到这个结果。

在搜索Pandas文档后,我也找不到任何提供您所显示结果的内置函数。有一个自制的解决方案可能对你有用;它依赖于使用Python的itertools.product形成的迭代器来表示这两个变量的所有组合。

这个解决方案没有优化,因为对于更大规模的数据,这个迭代器会比Numpy和Pandas的内置程序慢。不过,对于你这样大小的矩阵来说,它应该仍然很快。

list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)
nrows = len(raw.index)
combos = itertools.product(range(nrows), range(nrows))
heatmap = np.zeros((nrows + 1, nrows + 1))
heatmap[:-1, 0] = np.flip(raw['threshold'])
heatmap[-1, 1:] = raw['threshold']
for combo in combos:
heatmap[heatmap.shape[0] - combo[0] - 2, combo[1] + 1] =
raw['var_1'][combo[0]] + raw['var_2'][combo[1]]
print(heatmap)
[[500.   3.   1.   1.   0.   0.   0.]
[400.   6.   4.   4.   3.   3.   3.]
[300.   6.   4.   4.   3.   3.   3.]
[200.   7.   5.   5.   4.   4.   4.]
[100.   9.   7.   7.   6.   6.   6.]
[  0.   9.   7.   7.   6.   6.   6.]
[  0.   0. 100. 200. 300. 400. 500.]]

这是我想出的最好的。看起来也很有效我是在模式研究后找到这个解决方案的

代码:

import pandas as pd
import numpy as np
list1 = [[0,6,3], [100,6,1], [200,4,1], [300,3,0], [400,3,0], [500,0,0]]
cols = ['threshold', 'var_1', 'var_2']
raw = pd.DataFrame(list1, columns=cols)
for i, col_name in enumerate(raw['threshold'].values):
raw[col_name] = raw.iloc[i,2] + raw.iloc[:,1]
print(raw)

输出:

threshold  var_1  var_2  0  100  200  300  400  500
0          0      6      3  9    7    7    6    6    6
1        100      6      1  9    7    7    6    6    6
2        200      4      1  7    5    5    4    4    4
3        300      3      0  6    4    4    3    3    3
4        400      3      0  6    4    4    3    3    3
5        500      0      0  3    1    1    0    0    0