Crossin的编程教室
标题:
[求助]pandas groupby分组运行自定义函数报错
[打印本页]
作者:
elaine2018
时间:
2018-12-27 16:08
标题:
[求助]pandas groupby分组运行自定义函数报错
数据格式如下:
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
这是索引出问题了?没想通到底是哪一步错了,有大神有空指点一下吗?是代码的问题还是我的这个思路就是错的
作者:
crossin先生
时间:
2018-12-28 15:50
你贴的报错不完整,没有贴出是哪一行代码报错的
看报错是索引越界
你自己对照报错提示的行数,然后看那一行里哪里用到的index,具体的值和对应列表都输出出来,应该就能看出是哪里出问题了
对于你这个需求,如果已经是按chr顺序排列的数据,似乎完全不用分组,只要每一行和上一行比较,比较的时候顺便判断下chr是否相等,相等就是差值,不相等就是0,就可以了
欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/)
Powered by Discuz! X2.5