Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要根据两行之间的差异将行插入df_Python_Bioinformatics - Fatal编程技术网

Python 需要根据两行之间的差异将行插入df

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

我用一个程序来计算整个基因组的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   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)