设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 6705|回复: 1
打印 上一主题 下一主题

[求助]pandas groupby分组运行自定义函数报错

[复制链接]

3

主题

0

好友

25

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2018-12-27 16:08:03 |只看该作者 |倒序浏览
数据格式如下:
chr        start        end        length        site_num        depth        average
chr1        960502.0        960511.0        10.0        5        149.73        0.36
chr1        960604.0        960615.0        12.0        5        161.35        0.41
chr1        960979.0        960989.0        11.0        6        125.27        0.39
chr1        966821.0        966853.0        33.0        5        120.52        0.34
chr2        73177247.0        73177263.0        17.0        5        156.44        0.3
chr2        73233256.0        73233292.0        37.0        14        196.06        0.3
chr2        73233298.0        73233381.0        84.0        9        197.13        0.28
chr2        73234132.0        73234164.0        33.0        5        15.88        0.0
chr2        73234212.0        73234246.0        35.0        5        16.12        0.02

我的目的是按照第一列chr分组,相同的为一组,我想要在后面增加一列diff,其值是从第二行开始,每一行的第二列减上一行的第三列,因此每个组的第一行的diff值应该为0,理论上我的结果应该如下:
chr        start        end        length        site_num        depth        average        diff
chr1        960502        960511        10        5        149.73        0.36        0
chr1        960604        960615        12        5        161.35        0.41        93
chr1        960979        960989        11        6        125.27        0.39        364
chr1        966821        966853        33        5        120.52        0.34        5832
chr2        73177247        73177263        17        5        156.44        0.3        0
chr2        73233256        73233292        37        14        196.06        0.3        55993
chr2        73233298        73233381        84        9        197.13        0.28        6
chr2        73234132        73234164        33        5        15.88        0        751
chr2        73234212        73234246        35        5        16.12        0.02        48

我的代码如下:
  • df = pd.read_csv('region.txt',sep='\t')
  • def calculate_diff(df):
  •     diff = []
  •     diff.append(0)
  •     indexs = list(df.index)
  •     for i in range(indexs[1],indexs[-1]):
  •         d = df.iloc[i,1] - df.iloc[i-1,2]
  •         diff.append(d)
  •     DIFF = pd.DataFrame(diff,columns=['diff'])
  •     df1 = pd.concat([df,DIFF],axis=1)
  •     return(df1)
  • df.groupby('chr').apply(calculate_diff)

[color=rgb(51, 102, 153) !important]复制代码



考虑到groupby分组之后每个组的索引并不都是从0开始,所以我先把索引取出来形成一列表,但是运行的时候出现以下错误

  File "F:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 1638, in _is_valid_integer
    raise IndexError("single positional indexer is out-of-bounds")

IndexError: single positional indexer is out-of-bounds

这是索引出问题了?没想通到底是哪一步错了,有大神有空指点一下吗?是代码的问题还是我的这个思路就是错的
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2018-12-28 15:50:48 |只看该作者
你贴的报错不完整,没有贴出是哪一行代码报错的
看报错是索引越界
你自己对照报错提示的行数,然后看那一行里哪里用到的index,具体的值和对应列表都输出出来,应该就能看出是哪里出问题了

对于你这个需求,如果已经是按chr顺序排列的数据,似乎完全不用分组,只要每一行和上一行比较,比较的时候顺便判断下chr是否相等,相等就是差值,不相等就是0,就可以了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-19 10:50 , Processed in 0.016619 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部