为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只甜甜圈 2022-12-20 11:16:13
我正在尝试对 pandas df 中的列求和,其中该列等于特定值。使用下面的 df,其中['X'] == 'GrV',我想对 cols 求和('GrV A', 'GrV B')。但我正在返回nan值。import pandas as pddf = 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  Total0  GrV      4      3      5      1      4      3      5      1      81  GrX      2      4      2      2      2      4      2      2      82  GrY      6      5      2      5      6      5      2      5      43  GrZ      5      1      6      5      5      1      6      5     104  GrV      1      2      5      2      1      2      5      2      25  GrX      2      5      1      1      2      5      1      1     106  GrY      5      6      5      5      5      6      5      5     107  GrZ      6      2      4      4      6      2      4      4      8
查看完整描述

4 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

您可以通过使用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


查看完整回答
反对 回复 2022-12-20
?
三国纷争

TA贡献1804条经验 获得超7个赞

这是另一种方法:


for col in df['X'].tolist():

    df['Total_'+col] = np.where(df['X']==col, df[col+' A'] + df[col+' B'], np.NaN)


cols = [col for col in df.columns if col.startswith('Total_')]

df['Total'] = df[cols].sum(axis=1)

df.drop(columns=cols, inplace=True)

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


查看完整回答
反对 回复 2022-12-20
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

这是一种方法:将列 X 附加到索引,获得一对索引和列,其中可以在列中找到新索引中的值,使用结果值索引数据帧(使用loc),堆栈,取消堆栈和得到总数


#append column X to the index

df = df.set_index("X",append=True)


from itertools import product


#get pairing of index and column, where index is in column

index = [(first,second, last)

         for (first,second), last 

         in product(df.index,df.columns)

         if second in last]


#stack, index with the index variable,

#unstack, get the sum

#and assign to Total

df['Total'] = df.stack().loc[index].unstack().sum(axis=1)


df


           GrV A    GrX A   GrY A   GrZ A   GrV B   GrX B   GrY B   GrZ B   Total

X                                   

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


查看完整回答
反对 回复 2022-12-20
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

让我们melt试试groupby


s=df.reset_index().melt(['index','X']).loc[lambda x : x['X']==x['variable'].str.split(' ').str[0]].groupby('index').value.sum()

df['new']=s

df

     X  GrV A  GrX A  GrY A  GrZ A  GrV B  GrX B  GrY B  GrZ B  new

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


查看完整回答
反对 回复 2022-12-20
  • 4 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信