关于数据结构:pandas,使用引导置信区间计算许多平均值以进行绘图

Pandas, compute many means with bootstrap confidence intervals for plotting

我想为数据帧的某些子集计算具有自举置信区间的均值;最终目标是生成带有自举置信区间作为误差条的均值的条形图。我的数据框如下所示:

1
2
3
4
ATG12 Norm     ATG5 Norm    ATG7 Norm    Cancer Stage    
5.55           4.99         8.99         IIA
4.87           5.77         8.88         IIA
5.98           7.88         8.34         IIC

我感兴趣的子集是Norm专栏和癌症分期的每种组合。我设法使用以下方法生成了均值表:

1
df.groupby('Cancer Stage')['ATG12 Norm', 'ATG5 Norm', 'ATG7 Norm'].mean()

但是我需要使用此处描述的方法来计算引导程序置信区间,以将其用作每种方法的误差线:http://www.randalolson.com/2012/08/06/statistical-analysis-made-easy -在python /
归结为:

1
2
3
4
import scipy
import scikits.bootstraps as bootstraps
CI = bootstrap.ci(data=Series, statfunction=scipy.mean)
# CI[0] and CI[1] are your low and high confidence intervals

我尝试使用嵌套循环脚本将此方法应用于数据的每个子集:

1
2
3
4
5
6
for i in data.groupby('Cancer Stage'):
    for p in i.columns[1:3]: # PROBLEM!!
        Series = i[p]
        print p
        print Series.mean()
        ci = bootstrap.ci(data=Series, statfunction=scipy.mean)

哪个产生了错误消息

1
AttributeError: 'tuple' object has no attribute called 'columns'

我不知道什么是"元组",我需要做一些阅读工作,但是我担心我目前嵌套的for循环方法会给我留下我无法轻易绘制的某种数据结构。我是Pandas的新手,所以发现有一种更简单,更轻松的方法来生成我要绘制的数据,我不会感到惊讶。任何帮助都将不胜感激。


您遍历groupby对象的方式是错误的!当使用groupby()时,数据框将沿着groupby列中的值以及这些值作为组名进行切片,从而形成所谓的"元组":
(name, dataforgroup)。遍历groupby对象的正确方法是

1
2
3
4
for name, group in data.groupby('Cancer Stage'):
    print name
    for p in group.columns[0:3]:
    ...

请在此处阅读有关pandas的groupby功能的更多信息,并通过python-reference来了解什么是元组!

使用pandas的apply功能,基本上可以在一条语句中对数据帧进行分组并应用功能:

1
2
3
cols=data.columns[0:2]
for col in columns:
    print data.groupby('Cancer Stage')[col].apply(lambda x:bootstrap.ci(data=x, statfunction=scipy.mean))

只需一行即可完成您需要的一切,并为您生成一个(很容易绘制的)系列

编辑:
我玩弄了自己创建的数据框对象:

1
2
3
df = pd.DataFrame({'A':range(24), 'B':list('aabb') * 6, 'C':range(15,39)})
for col in ['A', 'C']:
    print df.groupby('B')[col].apply(lambda x:bootstrap.ci(data=x.values))

产生两个看起来像这样的系列:

1
2
3
4
5
6
7
B
a    [6.58333333333, 14.3333333333]
b                      [8.5, 16.25]

B
a    [21.5833333333, 29.3333333333]
b            [23.4166666667, 31.25]