Pandas:在类邻接矩阵表中生成实验结果

wydwbb8l  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一组实验结果(以下匿名子集),以从CSV文件读取的 Dataframe 格式('Input.csv')。我想以类似邻接矩阵的格式输出一个包含列'Experimenter'、'Subject'、'F'和'G'的表。它应该包括按多个条目的平均值进行的聚合-例如,"Alpha"和"Bravo"--作为"实验者"和"受试者"的相互作用。此外,主对角线上应该有"1.00"。最后,最终输出表应该写入CSV文件("Output.csv")。
实际输入:

Day,Experimenter,Subject,D,E,F,G
Monday,Alpha,Bravo,4,2,2.68,0.44
Monday,Charlie,Delta,0,2,0.62,2.29
Monday,Echo,Foxtrot,1,2,1.03,3.14
Monday,Golf,Hotel,1,2,0.75,2.53
Tuesday,India,Juliet,2,1,0.71,1.60
Wednesday,Foxtrot,Charlie,2,0,0.48,0.61
Thursday,Delta,Hotel,2,3,2.06,1.93
Thursday,Bravo,Alpha,1,1,0.53,0.41
Friday,Bravo,Delta,1,1,1.65,0.84
Friday,Golf,Alpha,0,0,0.19,1.30
Friday,India,Echo,1,0,1.31,0.58

预期输出:

Alpha   Bravo   Charlie Delta   Echo    Foxtrot Golf    Hotel   India   Juliet
Alpha   1.00    1.39    0.00    0.00    0.00    0.00    1.30    0.00    0.00    0.00
Bravo   0.485   1.00    0.00    1.65    0.00    0.00    0.00    0.00    0.00    0.00
Charlie 0.00    0.00    1.00    0.62    0.00    0.61    0.00    0.00    0.00    0.00
Delta   0.00    0.84    2.29    1.00    0.00    0.00    0.00    2.06    0.00    0.00
Echo    0.00    0.00    0.00    0.00    1.00    1.03    0.00    0.00    0.58    0.00
Foxtrot 0.00    0.00    0.48    0.00    3.14    1.00    0.00    0.00    0.00    0.00
Golf    0.19    0.00    0.00    0.00    0.00    0.00    1.00    0.75    0.00    0.00
Hotel   0.00    0.00    0.00    1.93    0.00    0.00    2.53    1.00    0.00    0.00
India   0.00    0.00    0.00    0.00    1.31    0.00    0.00    0.00    1.00    0.71
Juliet  0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    1.60    1.00

编码:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Day': ['Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday'],
                    'Experimenter': ['Alpha', 'Charlie', 'Echo', 'Golf', 'India', 'Foxtrot', 'Delta', 'Bravo', 'Bravo', 'Golf', 'India'],
                    'Subject': ['Bravo', 'Delta', 'Foxtrot', 'Hotel', 'Juliet', 'Charlie', 'Hotel', 'Alpha', 'Delta', 'Alpha', 'Echo'],
                    'D': [4, 0, 1, 1, 2, 2, 2, 1, 1, 0, 1],
                    'E': [2, 2, 2, 2, 1, 0, 3, 1, 1, 0, 0],
                    'F': [2.68, 0.62, 1.03, 0.75, 0.71, 0.48, 2.06, 0.53, 1.65, 0.19, 1.31],
                    'G': [0.44, 2.29, 3.14, 2.53, 1.60, 0.61, 1.93, 0.41, 0.84, 1.30, 0.58]})

adjacency_matrix = pd.crosstab(df['Experimenter'], df['Subject'], values=df['F'], aggfunc=np.mean)
adjacency_matrix = adjacency_matrix.fillna(0)

print('')
print(adjacency_matrix)

实际产量:

Subject       Alpha  Bravo  Charlie  Delta  Echo  Foxtrot  Hotel  Juliet
Experimenter                                                            
Alpha          0.00   2.68     0.00   0.00  0.00     0.00   0.00    0.00
Bravo          0.53   0.00     0.00   1.65  0.00     0.00   0.00    0.00
Charlie        0.00   0.00     0.00   0.62  0.00     0.00   0.00    0.00
Delta          0.00   0.00     0.00   0.00  0.00     0.00   2.06    0.00
Echo           0.00   0.00     0.00   0.00  0.00     1.03   0.00    0.00
Foxtrot        0.00   0.00     0.48   0.00  0.00     0.00   0.00    0.00
Golf           0.19   0.00     0.00   0.00  0.00     0.00   0.75    0.00
India          0.00   0.00     0.00   0.00  1.31     0.00   0.00    0.71

其是正确的,但是仅包括列"F",而不是根据需要同时包括"F"和"G"。
请指教?

z18hc3ub

z18hc3ub1#

下面的代码看起来生成了正确的输出(不是很符合习惯,但很实用):

ct_a = pd.crosstab(df['Experimenter'], df['Subject'], values=df['F'], aggfunc=np.mean).fillna(0)
ct_a.values[[np.arange(ct_a.shape[0])]*2] = 1
print('')
print(ct_a.head(23))

ct_b = pd.crosstab(df['Subject'], df['Experimenter'], values=df['G'], aggfunc=np.mean).fillna(0)
ct_b.values[[np.arange(ct_b.shape[0])]*2] = 1
print('')
print(ct_b.head(23))

a_m = (ct_a + ct_b).fillna(0)
a_m.values[[np.arange(a_m.shape[0])]*2] = 1
print('')
print(a_m.head(23))

然而,我仍然在努力从生成的矩阵(a_m)生成**'特征向量中心'**度量-任何帮助都是非常欢迎的!

相关问题