IndexError:单个位置索引器超出范围

时间:2017-09-21 19:12:17

标签: python pandas dataframe ggplot2

我有一个数据框:

df
           ID           val1     Param  val2   
0        0.0000        -0.7110  'A'   2.5 
1        0.0000        -0.7285  'A'   2.0 
2        0.0000        -0.4867  'B'   2.3 
3        0.0000        -0.5729  'C'   2.2 ...   
91296    0.0485         0.0733  'Y'   2.1 
91297    0.0485        -0.2035  'Y'   2.24 
91298    0.0485        -0.0479  'Z'   2.5 

我试图运行一个循环,我为每个id + param打印一个图 附加到列表,然后将图表保存到其关联的文件夹中 一个目录。

所需:

p = [] test = df.groupby(ID) for all IDs in test: for all unique params: p.append(create plot per id and associated param)

这是期望的输出:

文件夹(0.0000)

     --> 'A'.png
     --> 'B'.png
     --> 'C'.png

文件夹(0.0485)

     --> 'Y'.png
     --> 'Z'.png

这是我到目前为止所做的:

final_gr = df.groupby('ID') for j in final_gr.groups:
     df_slice = df[df['ID'] == j]
     p.append(ggplot(aes('val1','val2'), data = df_slice) + \
     geom_point(color='c') + ggtitle(element_text(text='Val1 vs %s\nat ID:
 %s'%(str(df_slice.Param.unique())[2:-2],str(df_slice.ID.unique())),size=15,face='bold'))
 + \
     theme_bw() + scale_y_continuous(name='%s'%str(df_slice.Param.unique())))
     for img in p:
         img.save(r'\DIRECTORY\%s\%s.png'%(str(df_slice.ID.unique())[2:-2],df_slice.Param.unique()))

2 个答案:

答案 0 :(得分:0)

我认为你可能会在这里混淆一​​些核心python格式。你可能正在寻找更像这样的东西。

import os
for key, group in df.groupby(by='ID'):
    p.append(ggplot(aes('val1','val2'), data = group) + \ 
    geom_point(color='c') + ggtitle(element_text(text='Val1 vs %s\nat ID:
    %s'%(str(group.Param.unique())
    [2:-2],str(key)),size=15,face='bold'))
    + \
    theme_bw() + scale_y_continuous(name='%s'%str(group.Param.unique())))
    for img in p:
        os.mkdir(r'\DIRECTORY\%s'%key)
        img.save(r'\DIRECTORY\%s\%s.png'(str(key[2:-2],df_slice.Param.unique()))

请注意,您可能想要创建要写入的目录,因为如果它不存在则不会自动为您创建。 (见os.mkdir)

我建议您先使用一个简单的循环检查键,循环结果组,如下所示:

for key, group in df.groupby(by='ID'):
    print key

for key, group in df.groupby(by='ID'):
    print group

答案 1 :(得分:0)

修正了它。刚刚在jfbeltran的代码中添加了三行,我首先(在上一步中外部)通过ID将Param名称提取到各自的文本文件,检查Param是否在ID中的文本文件中,然后创建一个匹配的新数据帧Param和ID:

for key, group in df.groupby(by='ID'):
for g in group.Param.unique():
    if g in open('%s.txt'%str(key)).read():
        df_slice = group[(group['ID'] == key) & (group['Param'] == g)]
        p.append(ggplot(aes('Val1','Val2'), data = df_slice) + \
        geom_point(color='c') + ggtitle(element_text(text='Val1 vs %s\nat ID:%s'%(str(g),
        str(key)),size=15,face='bold'))+ \
        theme_bw() + scale_y_continuous(name='%s'%str(g)))
        for img in p:
            #os.mkdir(r'DIRECTORY\%s'%key)
            img.save(r'DIRECTORY\%s\%s.png'%(str(key),str(g)))