从熊猫数据框中填充矩阵

时间:2021-07-27 00:33:06

标签: python python-3.x pandas numpy matrix

使用以下 df:

|Research|Thesis|Proposal|AI|Analytics|Data|
| -------|------|-------_|--|---------|----|
| 54     | 0    |0       |0 |5        |  0 |
| 33     | 43   |5       |0 |0        |  81|

我需要为所有可能的列对创建 2*2 矩阵,

eg: (0,1), (0,2), ... (0,n)
(1,2), (1,3),  (1,n)                 
(2,3), (2,4), (2,5), .....(2,n)

用这些列中的值填充它

对于pair(0,1),矩阵应该由第0 列和第1 列的学校1 的单词和第0 列和第1 列的学校2 的单词组成

例如:对于 [Research,Thesis] 或 (0,1) 对,矩阵将是

<头>
0 1
54 0
33 43

对于 [Research,Thesis] 或 (0,2) 对,矩阵将是

<头>
0 1
54 0
33 5

并确保每一行和每一列的总和为一个 > 零的值(如果没有,则不包括它们)即对于 2*2 矩阵 m,我们可以检查第一行: if (m[0,0] + m[0,1]) > 0. 需要对第二行以及第一和第二列这样做

我使用了 2 个 for 循环来获取所有可能的对,但我无法创建矩阵并检查所有组合的每一行和列的总和是否大于 0。

data=[[54, 0, 0, 6, 5, 0,],[33, 43, 5, 0, 76, 81]]
df=pd.DataFrame(data,columns = ['Research', 'Thesis', 'Proposal', 
'AI', 'Analytics', 'Data'])
#The 2 loops below create all possible pairs
for i in range(0,len(df.columns)):
        for j in range(i+1,len(df.columns)):
            matrix = np.zeros((2,2))

任何帮助将不胜感激!

编辑 输出应该只是矩阵的集合

1 个答案:

答案 0 :(得分:0)

IIUC,将 itertools.combinations 与运算符结合使用的一种方式:

from itertools import combinations

matrices = [d for c1, c2 in combinations(df.columns, 2) 
            if (d:=df[[c1, c2]]).sum(1).gt(0).all()]

输出:

# len(matrices)
[   Research  Thesis
0        54       0
1        33      43,
    Research  Proposal
0        54         0
1        33         5,
    Research  AI
0        54   6
1        33   0,
    Research  Analytics
0        54          5
1        33         76,
    Research  Data
0        54     0
1        33    81,
    Thesis  AI
0       0   6
1      43   0,
    Thesis  Analytics
0       0          5
1      43         76,
    Proposal  AI
0         0   6
1         5   0,
    Proposal  Analytics
0         0          5
1         5         76,
    AI  Analytics
0   6          5
1   0         76,
    AI  Data
0   6     0
1   0    81,
    Analytics  Data
0          5     0
1         76    81]