我需要生成一个热图,其中包含来自确定数量的库的库中位置的平均覆盖率,而不考虑每个库中转录组中的碱基数.换句话说,如果我想有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 中让我知道:)

推荐答案

IIUC您可以使用.merge来合并缺少的类别,然后用您想要的值填充任何NaNs:

df["data_bin"] = pd.cut(df["pos"], range(0, 12, 2))

df = pd.merge(
    df,
    df["data_bin"].cat.categories.to_frame(),
    left_on="data_bin",
    right_on=0,
    how="outer",
)[["chr", "data_bin", "cov"]]

df["chr"] = df["chr"].ffill().bfill()
df["cov"] = df["cov"].fillna(0)

df["avg"] = df.groupby("data_bin")["cov"].transform("mean")
print(df)

打印:

     chr     data_bin  cov       avg
0  chr17   (0.0, 2.0]  1.0  1.000000
1  chr17   (2.0, 4.0]  0.0  0.000000
2  chr17   (4.0, 6.0]  1.0  1.666667
3  chr17   (4.0, 6.0]  2.0  1.666667
4  chr17   (4.0, 6.0]  2.0  1.666667
5  chr17   (6.0, 8.0]  1.0  3.000000
6  chr17   (6.0, 8.0]  5.0  3.000000
7  chr17  (8.0, 10.0]  1.0  1.000000

Python相关问答推荐

如何比较numPy数组中的两个图像以获取它们不同的像素

如何使用html从excel中提取条件格式规则列表?

Pandas 都是(),但有一个门槛

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

ThreadPoolExecutor和单个线程的超时

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

Python列表不会在条件while循环中正确随机化'

使用BeautifulSoup抓取所有链接

如何排除prefecture_related中查询集为空的实例?

寻找Regex模式返回与我当前函数类似的结果

python中csv. Dictreader. fieldname的类型是什么?'

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

查看pandas字符列是否在字符串列中

将CSS链接到HTML文件的问题

时间戳上的SOAP头签名无效

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

根据边界点的属性将图划分为子图

Pandas:根据相邻行之间的差异过滤数据帧

Pandas 数据框自定义排序功能