如何在执行连接之前将染色体名称转换为pyranges中的相同格式
How to convert chromosome name to same format in pyranges before performing a join
我有多个 .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 获得所需的行为?
PyRanges
class中的数据存储在多个地方。除了 .Chromosome
,你还有 .dfs
,这是一个 dict
。这个 dict
中的 keys
在你调用 py1["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
在 table 中没有变化 - 这是因为,如上所述,数据存储在多个地方。
老实说 - 我对 PyRanges
了解不深,我不知道这样更新数据是否安全。
我强烈建议 预处理 您的数据,当它们仍处于 .bed
格式时。这将确保数据正确导入pyranges。
编辑 1/8/20:答案基于 pre-bugfix 行为,将来可能不需要。
我有多个 .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 获得所需的行为?
PyRanges
class中的数据存储在多个地方。除了 .Chromosome
,你还有 .dfs
,这是一个 dict
。这个 dict
中的 keys
在你调用 py1["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
在 table 中没有变化 - 这是因为,如上所述,数据存储在多个地方。
老实说 - 我对 PyRanges
了解不深,我不知道这样更新数据是否安全。
我强烈建议 预处理 您的数据,当它们仍处于 .bed
格式时。这将确保数据正确导入pyranges。
编辑 1/8/20:答案基于 pre-bugfix 行为,将来可能不需要。