我需要生成一个热图,其中包含来自确定数量的库的库中位置的平均覆盖率,而不考虑每个库中转录组中的碱基数.换句话说,如果我想有10个碱基,对于一个转录组,它可能有1000个碱基分布在10个储存箱中,另一个转录组可能有2445个碱基分布在10个储存箱中.
问题是,在我的覆盖率文件中,有一些不属于任何垃圾箱的间隙.例如,如果我想要10个位置上的5个垃圾箱,我将拥有:(0,2],(2,4],(4,6],(6,8],(8,10].如果我覆盖的位置是1,5,5,5,7,7,10,那么箱子"(2,4]"将被隐藏,因此不会出现在热图中.我想要的是这些没有覆盖范围的垃圾箱填满0,这样它们就会出现在热图中.
我正在使用带有PANAAS、SEBERN和matplot.pyplod库的Python
在下图中,第一行是我的垃圾箱的边缘位置,数据帧是垃圾箱的覆盖范围: enter image description here个
输入示例:
chr17 1 1
chr17 5 1
chr17 5 2
chr17 5 2
chr17 7 1
chr17 7 5
chr17 10 1
问题:
chr data_bin avg
chr17 (0,2] 1
chr17 (4,6] 1.66
chr17 (4,6] 1.66
chr17 (4,6] 1.66
chr17 (6,8] 3
chr17 (6,8] 3
chr17 (8,10] 1
预期:
chr data_bin avg
chr17 (0,2] 1
**chr17 (2,4] 0**
chr17 (4,6] 1.66
chr17 (4,6] 1.66
chr17 (4,6] 1.66
chr17 (6,8] 3
chr17 (6,8] 3
chr17 (8,10] 1
我使用的函数是:
def bins_calculator(path_txt:str, start:int,end:int):
column_names =["chr", "pos", "cov"]
data = pd.read_csv(path_txt, names = column_names, sep = '\t')
step = int((end - start) / 10)
n_bins = [start + i * step for i in range(11)]
n_bins[-1] = end
data["data_bin"] = pd.cut(data["pos"], bins = n_bins)
data["avg"] = data.groupby("data_bin", observed = False)["cov"].transform("mean")
filtered_data = data[["chr","data_bin","avg"]].drop_duplicates("data_bin")
return filtered_data
有关此问题的任何问题,请在 comments 中让我知道:)