Python 需要根据两行之间的差异将行插入df
我用一个程序来计算整个基因组的pi值。但是,此程序不会输出零值。我需要识别它跳过的窗口,并在其中添加零 这是我的档案:Python 需要根据两行之间的差异将行插入df,python,bioinformatics,Python,Bioinformatics,我用一个程序来计算整个基因组的pi值。但是,此程序不会输出零值。我需要识别它跳过的窗口,并在其中添加零 这是我的档案: CHROM BIN_START BIN_END N_VARIANTS PI scaffold_1 1 10000 103 0.00409768 scaffold_1 10001 20000 67 0.00421737 scaffold_1 20001 30000 129 0.00856667 scaffold_1 30001 40
CHROM BIN_START BIN_END N_VARIANTS PI
scaffold_1 1 10000 103 0.00409768
scaffold_1 10001 20000 67 0.00421737
scaffold_1 20001 30000 129 0.00856667
scaffold_1 30001 40000 142 0.00905
scaffold_1 40001 50000 188 0.0125167
scaffold_1 50001 60000 210 0.014
scaffold_1 60001 70000 158 0.0105333
scaffold_1 70001 80000 198 0.0131833
scaffold_1 80001 90000 183 0.0121833
scaffold_1 100001 110000 256 0.0170667
scaffold_1 110001 120000 263 0.0175667
如果您看到90001和100000之间的窗口丢失。实际上,我只需要在PI列中添加一行0
我想到的方法是添加一个条件语句,如果第一个值和第二个值之间的差距大于10000,则添加一行零。但是,由于间隙较大(即一排缺少2或3个垃圾箱),我担心使用这种方法会最终缺少它们
from io import StringIO
import pandas as pd
import numpy as np
df = pd.read_csv(StringIO(
'''CHROM BIN_START BIN_END N_VARIANTS PI
scaffold_1 1 10000 103 0.00409768
scaffold_1 10001 20000 67 0.00421737
scaffold_1 20001 30000 129 0.00856667
scaffold_1 30001 40000 142 0.00905
scaffold_1 40001 50000 188 0.0125167
scaffold_1 80001 90000 183 0.0121833
scaffold_1 100001 110000 256 0.0170667
scaffold_1 110001 120000 263 0.0175667
scaffold_2 10001 20000 10 0.003
scaffold_2 30001 40000 10 0.003
'''), sep=' ')
def fill_function(group_df, step_size=10000):
bin_start_vals = np.arange(0, group_df['BIN_START'].max() + step_size, step=step_size)
# set our index to BIN_START so we dont lose what we have and then reindex to the full range of values
group_df = group_df.set_index('BIN_START').reindex(bin_start_vals)
# reset to fix up columns
group_df = group_df.reset_index()
# fill in empty data
group_df['BIN_END'] = group_df['BIN_START'] + step_size
# drop CHROM, we already have from groupby and fillna with 0
return group_df.drop('CHROM', axis=1).fillna(0)
dfx = df.groupby(['CHROM']).apply(fill_function)
dfx.reset_index(level=0)
CHROM BIN_START BIN_END N_VARIANTS PI
0 scaffold_1 1 10001 103.0 0.004098
1 scaffold_1 10001 20001 67.0 0.004217
2 scaffold_1 20001 30001 129.0 0.008567
3 scaffold_1 30001 40001 142.0 0.009050
4 scaffold_1 40001 50001 188.0 0.012517
5 scaffold_1 50001 60001 0.0 0.000000
6 scaffold_1 60001 70001 0.0 0.000000
7 scaffold_1 70001 80001 0.0 0.000000
8 scaffold_1 80001 90001 183.0 0.012183
9 scaffold_1 90001 100001 0.0 0.000000
10 scaffold_1 100001 110001 256.0 0.017067
11 scaffold_1 110001 120001 263.0 0.017567
0 scaffold_2 1 10001 0.0 0.000000
1 scaffold_2 10001 20001 10.0 0.003000
2 scaffold_2 20001 30001 0.0 0.000000
3 scaffold_2 30001 40001 10.0 0.003000
我认为解决方案可以通过利用重新索引到您想要的全部范围来实现。这样就不需要逐行比较,而是设置所需的行,然后用所拥有的内容填充它们
在我上面共享的代码中,为了示例起见,我删除了更多的行,并添加了一个scaffold_2,以展示我们如何通过scaffold而不是全局实现这一点
假设:
每个染色体都有一个不同的BIN_开始/结束范围,对于较小的支架,您可能希望避免大量的尾随0,因此您需要使用groupby
对于脚手架,无论数据是否包含,您总是从1开始,并且希望包含那些包含0的数据
我认为解决方案可以通过利用重新索引到您想要的全部范围来实现。这样就不需要逐行比较,而是设置所需的行,然后用所拥有的内容填充它们
在我上面共享的代码中,为了示例起见,我删除了更多的行,并添加了一个scaffold_2,以展示我们如何通过scaffold而不是全局实现这一点
假设:
每个染色体都有一个不同的BIN_开始/结束范围,对于较小的支架,您可能希望避免大量的尾随0,因此您需要使用groupby
对于脚手架,无论数据是否有,您总是从1开始,并且希望包括0的数据。但是,如果间隙较大(即一行中缺少2或3个箱子),我担心使用这种方法最终会丢失它们。找到答案很容易,对吧?我用一个程序来计算整个基因组的pi值。但是,此程序不会输出零值。是您编写的程序,还是您无法控制的软件?您如何在程序中获取bin范围?如果您的BIN在10000范围内定义良好,那么这两行代码将使您的数据以适当的集合显示
bins=np.arange(0,df['values'],10000)代码>df['bins']=pd.cut(df['values'],bins)
但是,如果间隙较大(即一行中缺少2或3个箱子),我担心使用这种方法会最终缺少它们。找到答案很容易,对吧?我用一个程序来计算整个基因组的pi值。但是,此程序不会输出零值。是您编写的程序,还是您无法控制的软件?您如何在程序中获取bin范围?如果您的BIN在10000范围内定义良好,那么这两行代码将使您的数据以适当的集合显示bins=np.arange(0,df['values'],10000)代码>df['bin']=pd.cut(df['values'],bin)