我想为数据帧的某些子集计算具有自举置信区间的均值;最终目标是生成具有自举置信区间作为误差条的均值的条形图。我的数据框如下所示:
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的新手,所以我不会惊讶地发现有一种更简单,更简单的方法来生成我想要绘制的数据。任何和所有的帮助将非常感谢。
答案 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]