对行值等于标题的列求和 - 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


一只甜甜圈
浏览 99回答 4
4回答

慕尼黑8549860

您可以通过使用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  Total0  GrV      4      3      5      1      4      3      5      1    8.01  GrX      2      4      2      2      2      4      2      2    8.02  GrY      6      5      2      5      6      5      2      5    4.03  GrZ      5      1      6      5      5      1      6      5   10.04  GrV      1      2      5      2      1      2      5      2    2.05  GrX      2      5      1      1      2      5      1      1   10.06  GrY      5      6      5      5      5      6      5      5   10.07  GrZ      6      2      4      4      6      2      4      4    8.0

三国纷争

这是另一种方法: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  Total0  GrV      4      3      5      1      4      3      5      1    8.01  GrX      2      4      2      2      2      4      2      2    8.02  GrY      6      5      2      5      6      5      2      5    4.03  GrZ      5      1      6      5      5      1      6      5   10.04  GrV      1      2      5      2      1      2      5      2    2.05  GrX      2      5      1      1      2      5      1      1   10.06  GrY      5      6      5      5      5      6      5      5   10.07  GrZ      6      2      4      4      6      2      4      4    8.0

米琪卡哇伊

这是一种方法:将列 X 附加到索引,获得一对索引和列,其中可以在列中找到新索引中的值,使用结果值索引数据帧(使用loc),堆栈,取消堆栈和得到总数#append column X to the indexdf = df.set_index("X",append=True)from itertools import product#get pairing of index and column, where index is in columnindex = [(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 Totaldf['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   TotalX                                   0   GrV      4       3       5       1       4       3       5      1       8.01   GrX      2       4       2       2       2       4       2      2       8.02   GrY      6       5       2       5       6       5       2      5       4.03   GrZ      5       1       6       5       5       1       6      5      10.04   GrV      1       2       5       2       1       2       5      2       2.05   GrX      2       5       1       1       2       5       1      1      10.06   GrY      5       6       5       5       5       6       5      5      10.07   GrZ      6       2       4       4       6       2       4      4       8.0

慕田峪4524236

让我们melt试试groupbys=df.reset_index().melt(['index','X']).loc[lambda x : x['X']==x['variable'].str.split(' ').str[0]].groupby('index').value.sum()df['new']=sdf     X  GrV A  GrX A  GrY A  GrZ A  GrV B  GrX B  GrY B  GrZ B  new0  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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python