通过行标签对数据框中的值求和

Summing values in a dataframe over row labels

我有以下形式的数据框

    index    FACTOR1     FACTOR2    FACTOR3
0   ECON1   -0.068475   -0.000000   -0.000000
1   ECON2   0.000000    0.056963    0.000000
2   ECON2   0.000000    0.000000    0.041488
3   FOOD1   0.018582    0.000000    0.000000
4   FOOD2   -0.000000   -0.000000   -0.044363
5   FOOD3   -0.000000   -0.057993   -0.000000
6   ENV1    -0.045415   -0.000000   -0.000000
7   ENV2    0.000000    0.000000    0.044539
8   HEA1    -0.000000   -0.069631   -0.000000
9   HEA2    -0.000000   -0.000000   -0.026604
10  HEA3    0.028243    0.000000    0.000000
11  PERS1   0.000000    0.000000    0.085750
12  PERS2   0.000000    0.017831    0.000000
13  PERS3   0.069533    0.000000    0.000000
14  COM1    -0.025689   -0.000000   -0.000000
15  COM2    -0.029949   -0.000000   -0.000000
16  POL1    -0.000000   -0.061723   -0.000000
17  POL2    0.059108    0.000000    0.000000

我的目标是对每个行标签上的 Factor 1Factor 2Factor 3 列的值求和。我所说的标签是例如 ECON,它聚合了 ECON1ECON2ECON3。同样,FOOD 是另一个标签,包含 FOOD1FOOD2FOOD3

我想按以下形式创建一个字符串数组:

labels=['ECON', 'FOOD', 'ENV', 'HEA', 'PERS', 'COM', 'POL'] 并遍历所有对应的 labels,展平它们的值并求和。逻辑如下:

summation=[]
for i in range(labels):
    summation[i,:]=np.sum(xxxx)

但是,我不确定如何在循环中处理它,因为在每个标签上我都有一个值矩阵。

非常感谢任何帮助

IIUC 你可以 extract 组名和 sum:

print (df.assign(group=df["index"].str.extract("([A-Z]+)"))
         .groupby("group").sum())

或使用您的标签列表:

labels=['ECON', 'FOOD', 'ENV', 'HEA', 'PERS', 'COM', 'POL']

print (df.assign(group=df["index"].str.extract(f"({'|'.join(labels)})"))
         .groupby("group").sum())

结果:

        FACTOR1   FACTOR2   FACTOR3
group                              
COM   -0.055638  0.000000  0.000000
ECON  -0.068475  0.056963  0.041488
ENV   -0.045415  0.000000  0.044539
FOOD   0.018582 -0.057993 -0.044363
HEA    0.028243 -0.069631 -0.026604
PERS   0.069533  0.017831  0.085750
POL    0.059108 -0.061723  0.000000

这是一个建议的答案,它完善了 Henry 之前的答案

labels=['ECON', 'FOOD', 'ENV', 'HEA', 'PERS', 'COM', 'POL']

AugmentedMatrix=ReadyMatrix.assign(group=ReadyMatrix["index"].str.extract(f"({'|'.join(labels)})"))             

summation=np.zeros(( len(labels) , 1 ))
for i in range(len(labels)):
    print(labels[i])                               
    temp=AugmentedMatrix.loc[AugmentedMatrix['group']==labels[i], ['FACTOR1', 'FACTOR2', 'FACTOR3']].values
    summation[i]=np.sum(temp) 
print(summation)