python之Pandas groupby nunique 输出到列表

bhlsheji 阅读:78 2024-07-26 13:47:55 评论:0

我有一个如下数据集作为输入:

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 Groupbynunique():

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)] 

知道如何解决这个问题吗?

对于所有可能想出解决方案的人,我在一个大程序中这样做了数千次,所以速度是一个大问题。这就是我避免使用 BedToolspybedtools

等其他工具的原因

谢谢!

请您参考如下方法:

第一个 reset_index然后在 list comprehension 中转换为 tuples:

L = [tuple(x) for x in sortedd.reset_index().values.tolist()] 
print (L) 
[('chr1', 784344, 800125, 1), ('chr1', 784344, 800124, 2)] 


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号