2

我有多个 .bed 文件,我想对它们执行连接、交集等操作。我正在使用pyranges库来读取 .bed 文件并执行这些操作。由于 .bed 文件允许命名带有或不带有“chr”前缀的染色体,我想在执行操作之前将不同 .bed 文件中的所有染色体名称格式化为相同的格式。因此,操作会产生预期的输出。

我试过了,

>>> import pandas as pd
>>> import pyranges as pr
>>> df1 = pd.DataFrame({"Chromosome": ["chr1", "chr2"], "Start": [100, 200],
...                    "End": [150, 201]})
>>> py1 = pr.PyRanges(df1)
>>> df2 = pd.DataFrame({"Chromosome": ["1", "2"], "Start": [1000, 2000],
...                    "End": [1500, 20010]})
>>> py2 = pr.PyRanges(df2)
>>> def modify_chrom_series(df):
...    df.Chromosome = df.Chromosome.apply(lambda val: val.replace("chr", ""))
...    return df
>>> def fix_chrom(regions):
...    return regions.apply(modify_chrom_series)
>>> py1 = fix_chrom(py1)
>>> py1
+--------------+-----------+-----------+
|   Chromosome |     Start |       End |
|   (category) |   (int32) |   (int32) |
|--------------+-----------+-----------|
|            1 |       100 |       150 |
|            2 |       200 |       201 |
+--------------+-----------+-----------+
>>> py2 = fix_chrom(py2)
>>> py2

+--------------+-----------+-----------+
|   Chromosome |     Start |       End |
|   (category) |   (int32) |   (int32) |
|--------------+-----------+-----------|
|            1 |      1000 |      1500 |
|            2 |      2000 |     20010 |
+--------------+-----------+-----------+

>>> py1["1"]    
Empty PyRanges
>>> py1["chr1"]
+--------------+-----------+-----------+
|   Chromosome |     Start |       End |
|   (category) |   (int32) |   (int32) |
|--------------+-----------+-----------|
|            1 |       100 |       150 |
+--------------+-----------+-----------+

>>> py1.join(py2)
Empty PyRanges

使用上面的代码,染色体名称被格式化,但染色体名称在 pyranges 中的映射保持不变。因此,join 或 query py1["1"] 之类的操作无法按预期工作。

有没有办法使用 pyranges 获得所需的行为?

4

1 回答 1

2

类中的数据PyRanges存储在多个位置。除了.Chromosome, 你还有.dfs哪个是dict. 这keysdictpy1["1"]打电话时会用到。

您还需要更新字典

>>> df1 = pd.DataFrame({"Chromosome": ["chr1", "chr2"], "Start": [100, 200],
                       "End": [150, 201]})
>>> py1 = pr.PyRanges(df1)
>>> py1.dfs["1"] = py1.dfs['chr1']
>>> del py1.dfs['chr1']
>>> py1["1"]

+--------------+-----------+-----------+
| Chromosome   |     Start |       End |
| (category)   |   (int32) |   (int32) |
|--------------+-----------+-----------|
| chr1         |       100 |       150 |
+--------------+-----------+-----------+
Unstranded PyRanges object has 1 rows and 3 columns from 1 chromosomes.
For printing, the PyRanges was sorted on Chromosome.

请注意,表name中的染色体没有改变 - 这是因为,如上所述,数据存储在多个位置。

老实说 - 我不明白PyRanges,我不知道这样更新数据是否安全。

我强烈建议您在数据仍处于格式状态时对其进行预处理。.bed这将确保将数据正确导入 pyranges。

20 年 1 月 8 日编辑:答案基于修复前的行为,将来可能不需要。

于 2020-07-20T07:05:59.463 回答