Pandas groupby nunique输出到列表

时间:2018-01-31 15:18:27

标签: python pandas

我输入了如下数据集:

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值的行,并计算'中值的隐含出现次数。对于已合并的行,请阅读' 列。最后,我想将转换输出转换为列表/元组,如本例所示(注意最后一列有计数信息):

[('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

然而,当我使用:

将其转换为list / tuple时
 sortedd.index.tolist()

排除最后一列,导致产生结果:

[('chr1', 784344, 800125), ('chr1', 784344, 800124)]

关于如何解决这个问题的任何想法?

对于那些可能提出解决方案的人来说,我在一个大型程序中做了数千次,所以速度是一个大问题。这就是我避开其他工具的原因,比如 BedTools pybedtools

谢谢!

3 个答案:

答案 0 :(得分:3)

你可以set_index

sortedd.to_frame('val').set_index('val',append=True).index.tolist()
Out[277]: [('chr1', 784344, 800125, 1), ('chr1', 784344, 800124, 2)]

答案 1 :(得分:3)

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

答案 2 :(得分:3)

您可以使用多索引,即

idx = pd.MultiIndex.from_arrays(sortedd.reset_index().values.T)

idx.tolist()
[('chr1', 784344, 800125, 1), ('chr1', 784344, 800124, 2)]