当其他列满足条件时计算列中的行总和

Calculating the sum of rows in a column when other columns satisfy a criterion

我有一个看起来像这样的数据框(代码在底部,如果你关心的话):

                A    B   C   D       E
Year Category                          
1980 Alpha     100  800  10  15  1.2350
     Bravo     200  700  20  25  2.3550
     Charlie   300  600  30  35  3.3600
     Delta     400  500  40  45  4.4448
1981 Alpha     500  400  50  55  5.5000
     Bravo     600  300  60  65  6.0000
     Charlie   700  200  70  75  7.2000
     Delta     800  100  80  85  8.0000

对于每一年,我都试图获取 E 中的值大于当年中位数的所有行的 A-D 列的总和(和平均值)。

因此,对于 1980 年,只有 Charlie & Delta 有资格在 E 列中具有大于该年中位数的值。因此 A 列的结果应该是 ...总和 = 300 + 400 = 700 ... 平均值 = 平均值 (300, 400) = 350

我在这里最接近的是使用 groupby / median

df.groupby(['Year']).median()

...但是我不太确定如何处理输出。这给了我每年的中位数,但我不能轻易地 link 将这些结果返回到我的初始数据框。

数据框代码:

data = {'A': [100,200,300,400,500,600,700,800], 
        'B': [800,700,600,500,400,300,200,100], 
        'C': [10,20,30,40,50,60,70,80], 
        'D': [15,25,35,45,55,65,75,85], 
        'E': [1.235,2.355,3.36,4.4448,5.5,6,7.2,8]}

idx = pd.MultiIndex.from_product([[1980, 1981],['Alpha','Bravo', 'Charlie','Delta']], names=['Year','Category'])
df = pd.DataFrame(data, index=idx, columns=['A', 'B', 'C', 'D', 'E'])

IIUC,你可以在第一层做一个 groupby 并在 E 列上转换 median ,然后比较并删除 E 超过中位数的行和 level=0 上的总和:

s = df['E'].gt(df.groupby(level=0)['E'].transform('median'))
df.drop('E',1)[s].sum(level=0)

        A     B    C    D
Year                      
1980   700  1100   70   80
1981  1500   300  150  160

为了将均值和总和并排堆叠,您可以对 concat 和 add_suffix 执行相同的操作以识别:

s = df['E'].gt(df.groupby(level=0)['E'].transform('median'))
m = df.drop('E',1)[s]
pd.concat((m.sum(level=0).add_suffix('_sum'),m.mean(level=0).add_suffix('_avg')),axis=1)

      A_sum  B_sum  C_sum  D_sum  A_avg  B_avg  C_avg  D_avg
Year                                                        
1980    700   1100     70     80    350    550     35     40
1981   1500    300    150    160    750    150     75     80