当其他列满足条件时计算列中的行总和
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
我有一个看起来像这样的数据框(代码在底部,如果你关心的话):
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