簡體   English   中英

Pandas groupby nunique輸出到列表

[英]Pandas groupby nunique output to list

我輸入了如下數據集:

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”列中值的意外出現次數。 最后,我想將轉換輸出轉換為list / tuple,如本例所示(注意最后一列有計數信息):

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

但是,當我使用以下命令將其轉換為list / tuple時:

 sortedd.index.tolist()

排除最后一列,導致結果輸出:

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

關於如何解決這個問題的任何想法?

對於那些可能提出解決方案的人來說,我在一個大型程序中做了好幾千次,所以速度是個大問題。 這就是我避免使用BedToolspybedtools等其他工具的原因

謝謝!

你可以set_index

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

首先reset_index然后在list comprehension reset_index中轉換為tuples

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

你可以使用多索引即

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM