python - 对行值等于标题的列求和 - Pandas

标签 python pandas

我正在尝试对 pandas df 中的列求和,其中列等于特定值。使用下面的 df,其中 ['X'] == 'GrV',我想对 cols ('GrV A', 'GrV B') 求和。但我正在返回 nan 值。

import pandas as pd

df = pd.DataFrame({
    'X' : ['GrV', 'GrX', 'GrY', 'GrZ', 'GrV', 'GrX', 'GrY', 'GrZ'],  
    'GrV A' : [4, 2, 6, 5, 1, 2, 5, 6],                  
    'GrX A' : [3, 4, 5, 1, 2, 5, 6, 2], 
    'GrY A' : [5, 2, 2, 6, 5, 1, 5, 4],
    'GrZ A' : [1, 2, 5, 5, 2, 1, 5, 4], 
    'GrV B' : [4, 2, 6, 5, 1, 2, 5, 6],                  
    'GrX B' : [3, 4, 5, 1, 2, 5, 6, 2], 
    'GrY B' : [5, 2, 2, 6, 5, 1, 5, 4],
    'GrZ B' : [1, 2, 5, 5, 2, 1, 5, 4],                            
        })

df['Total'] = df.loc[(df['X'] == 'GrV'), ('GrV A', 'GrV B')].sum()
df['Total'] = df.loc[(df['X'] == 'GrX'), ('GrX A', 'GrX B')].sum()
df['Total'] = df.loc[(df['X'] == 'GrY'), ('GrY A', 'GrY B')].sum()
df['Total'] = df.loc[(df['X'] == 'GrZ'), ('GrZ A', 'GrZ B')].sum()

预期输出:

     X  GrV A  GrX A  GrY A  GrZ A  GrV B  GrX B  GrY B  GrZ B  Total
0  GrV      4      3      5      1      4      3      5      1      8
1  GrX      2      4      2      2      2      4      2      2      8
2  GrY      6      5      2      5      6      5      2      5      4
3  GrZ      5      1      6      5      5      1      6      5     10
4  GrV      1      2      5      2      1      2      5      2      2
5  GrX      2      5      1      1      2      5      1      1     10
6  GrY      5      6      5      5      5      6      5      5     10
7  GrZ      6      2      4      4      6      2      4      4      8

最佳答案

你可以通过使用filter来获取列Gr,使用where通过split得到的列名的第一个元素(到得到 GrV, GrX, ... 部分)等于列 X 和沿列的 sum:

df['Total'] = (df.filter(like='Gr')
                 .where(lambda x: df['X'].to_numpy()[:, None]
                                  == x.columns.str.split(' ').str[0].to_numpy())
                 .sum(axis=1)
              )
print (df)
     X  GrV A  GrX A  GrY A  GrZ A  GrV B  GrX B  GrY B  GrZ B  Total
0  GrV      4      3      5      1      4      3      5      1    8.0
1  GrX      2      4      2      2      2      4      2      2    8.0
2  GrY      6      5      2      5      6      5      2      5    4.0
3  GrZ      5      1      6      5      5      1      6      5   10.0
4  GrV      1      2      5      2      1      2      5      2    2.0
5  GrX      2      5      1      1      2      5      1      1   10.0
6  GrY      5      6      5      5      5      6      5      5   10.0
7  GrZ      6      2      4      4      6      2      4      4    8.0

关于python - 对行值等于标题的列求和 - Pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62142973/

相关文章:

python - 通过node-red将Python连接到网页

python - Jython 随机模块产生与 cpython 不同的结果

python - 在函数内合并数据帧

python - 根据 pandas 列中的数据,当 true 为 1 和 0 时附加一个空列表?

python - 使用 pandas 读取 csv 的第 0 行并将其保存到列表中

python - 重新验证/确认用户凭据

python - python 中的种群遗传学建模

python - 在 Python 中自动读取文件

Python pandas - 将 groupby 输出写入文件

python - 包含数组的 Pandas 系列