我想知道以下计算是否可以简化或可以使用替代计算:
id | group | value
01 | 1 | 5
01 | 1 | 6
02 | 1 | 35
02 | 1 | 40
03 | 1 | 90
03 | 1 | 95
control | 1 | 50
control | 1 | 60
04 | 2 | 35
04 | 2 | 36
05 | 2 | 15
05 | 2 | 10
06 | 2 | 20
06 | 2 | 25
control | 2 | 30
control | 2 | 40
首先计算每组所有控件的平均值:
id | group | value_mean
control | 1 | 55
control | 2 | 35
然后计算每个ID相对于控件的平均差异:
id | group | value_mean_percent
01 | 1 | 10
02 | 1 | 68
03 | 1 | 168
04 | 2 | 101
05 | 2 | 36
06 | 2 | 64
id = 1的示例 (5 + 6)/ 2 * 100/55 = 10%
还有另一种解释此类数据结果的方法吗?
答案 0 :(得分:1)
我认为您可以定义一个对数据框的子组起作用的函数,该函数将value
除以id
分组,计算均值并返回除以控件的所有结果:
def func(da):
da = da.groupby('id')['value'].mean()
return 100*da[da.index != "control"]/da['control']
然后,您只需按group
将data.frame分组,应用此功能并重置索引:
import pandas as pd
import numpy as np
df = pd.DataFrame({"id":np.repeat(['01','02','03','control','04','05','06','control'],2),
"group":np.repeat([1,2],8),
"value":[5,6,35,40,90,95,50,60,35,36,15,10,20,25,30,40]})
df.groupby('group').apply(func).reset_index()
group id value
0 1 01 10.000000
1 1 02 68.181818
2 1 03 168.181818
3 2 04 101.428571
4 2 05 35.714286
5 2 06 64.285714