【发布时间】:2018-01-31 15:18:27
【问题描述】:
我有一个如下数据集作为输入:
labels = ['chrom', 'start', 'end', 'read']
my_data = [['chr1', 784344, 800125, 'read1'],
['chr1', 784344, 800124, 'read2'],
['chr1', 784344, 800124, 'read3']]
我使用以下方法将其转换为 pandas 数据框:
my_data_pd = pd.DataFrame.from_records(my_data, columns=labels)
看起来像这样:
chrom start end read
0 chr1 784344 800125 read1
1 chr1 784344 800124 read2
2 chr1 784344 800124 read3
我想要做的是以下内容:我不想合并具有相同 chrom、start、end 值的行,并计算 'read' 中值的不同出现次数 合并的行的列。最后,我想将该输出转换为列表/元组,如本例所示(注意最后一列包含计数信息):
[('chr1', 784344, 800125,1), ('chr1', 784344, 800124,2)]
我能做到的:
使用以下命令取消 Pandas Groupby 和 nunique():
my_data_pd.groupby(['chrom','start','end'],sort=False).read.nunique()
我到达了一个看起来像我想要的东西的 Pandas.Series 对象:
chrom start end
chr1 784344 800125 1
800124 2
Name: read, dtype: int64
但是,当我使用以下方法将其转换为列表/元组时:
sortedd.index.tolist()
最后一列被排除,导致输出结果:
[('chr1', 784344, 800125), ('chr1', 784344, 800124)]
知道如何解决这个问题吗?
对于所有可能想出解决方案的人,我在一个大程序中这样做了数千次,所以速度是一个大问题。这就是我避免使用 BedTools 和 pybedtools
等其他工具的原因谢谢!
【问题讨论】: