Pandas,用绘图的自举置信区间计算许多均值

时间:2014-07-10 20:17:27

标签: data-structures pandas nested-loops bootstrapping confidence-interval

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

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列和癌症阶段的每个组合。我已设法使用以下方法生成一个方法表:

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

但我需要使用此处描述的方法计算bootstrap置信区间,以用作每个方法的误差条:http://www.randalolson.com/2012/08/06/statistical-analysis-made-easy-in-python/ 归结为:

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

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

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)

其中产生了错误消息

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

不知道“元组”是什么,我有一些阅读要做,但我担心我目前的嵌套for循环方法会给我留下一些我无法轻易绘制的数据结构。我是Pandas的新手,所以我不会惊讶地发现有一种更简单,更简单的方法来生成我想要绘制的数据。任何和所有的帮助将非常感谢。

1 个答案:

答案 0 :(得分:1)

迭代groupby-object的方式是错误的!当您使用groupby()时,您的数据框将沿着groupby-columns中的值进行切片,以及这些值作为组名,形成一个所谓的"元组": (name, dataforgroup)。迭代groupby-objects的正确方法是

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

请详细了解pandas here的groupby功能,并浏览python-reference以了解元组是什么!

分组数据框和应用函数基本上是在一个语句中使用apply - pandas的功能完成的:

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))

在一行中完成所需的一切,并为您制作一个(可绘制的)系列

修改: 我玩弄了自己创建的数据框对象:

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))

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

B
a    [6.58333333333, 14.3333333333]
b                      [8.5, 16.25]

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