【问题标题】:count lines with same value in column in python在python的列中计算具有相同值的行
【发布时间】:2014-07-05 00:35:26
【问题描述】:

我正在尝试在 python 中重现 R aggregate() 函数,但没有连接。对于每一行,我只想计算给定列中具有相似值的行的出现次数。

我正在尝试从此处获取的一段代码中解决这个问题: http://timotheepoisot.fr/2011/12/01/the-aggregate-function-in-python/

我实现的修改由### 表示。我目前遇到的问题是第一列 [0] 包含字符串,并且代码似乎只适用于浮点数。

import numpy as np
import scipy as sp  

def MSD(vec):
    return [np.mean(vec),np.std(vec)]  
def aggregate(df,by=0,to=1,func=np.sum):
    Dat = []
#    ColBy = df.T[by]
    ColBy = int(df.T[by][3:]) ### my attempt to read only the numbers in the first column's character strings
    ColTo = df.T[to] 
    UniqueBy = np.sort(np.unique(ColBy))
    for ub in UniqueBy:
        uTo = ColTo[ColBy==ub]
        Out = func(uTo)
#        Dat.append(np.concatenate(([ub],Out)))
        Dat.append([ub],Out) ### because I do not want to concatenate
    return Dat  

test_df = np.loadtxt('in_test.txt')  
Agr = aggregate(test_df,0,3,MSD)
sp.savetxt("out_test.txt", Agr) 

这是错误信息:

Traceback (most recent call last):
  File "count_same_reads.py", line 30, in <module>
    test_df = np.loadtxt('in_test.txt')
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 796, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
ValueError: could not convert string to float: Tag19184

我的数据是制表符分隔的,主要包含字符串,除了第 3 列,我想在其中写入行的出现次数。

这是测试数据:

Tag19184    CTAAC   hffef   1   a   36  -   chr1    10006   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10012   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10018   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10024   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10030   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10036   0   36M 36
Tag19184    CTAAC   hffef   1   a   36  -   chr1    10042   0   36M 36
Tag20198    CTAAC   hffef   1   a   36  -   chr1    10048   0   36M 36
Tag20198    CTAAC   hffef   1   a   36  -   chr1    10054   0   36M 36
Tag45093    CTAAC   hffef   1   a   36  -   chr1    10060   0   36M 36

结果应该是这样的:

Tag19184    CTAAC   hffef   7   a   36  -   chr1    10006   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10012   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10018   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10024   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10030   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10036   0   36M 36
Tag19184    CTAAC   hffef   7   a   36  -   chr1    10042   0   36M 36
Tag20198    CTAAC   hffef   2   a   36  -   chr1    10048   0   36M 36
Tag20198    CTAAC   hffef   2   a   36  -   chr1    10054   0   36M 36
Tag45093    CTAAC   hffef   1   a   36  -   chr1    10060   0   36M 36

正如您可能知道的那样,我还不太擅长 python。欢迎任何建议。

[编辑] PS。数据已按列 [0] 排序。

【问题讨论】:

  • pandas 模块中有aggregation 函数。但我不知道 R。
  • 是否可以在连接的情况下使用它?

标签: python count concatenation aggregate


【解决方案1】:

我会建议pandas,尤其是在你的基因组数据的情况下,数据的大小可能会相当大:

In [44]:
#you can read you data by pandas.read_csv()
import pandas as pd
print df
         v0     v1     v2  v3 v4  v5 v6    v7     v8  v9  v10  v11
0  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10006   0  36M   36
1  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10012   0  36M   36
2  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10018   0  36M   36
3  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10024   0  36M   36
4  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10030   0  36M   36
5  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10036   0  36M   36
6  Tag19184  CTAAC  hffef   1  a  36  -  chr1  10042   0  36M   36
7  Tag20198  CTAAC  hffef   1  a  36  -  chr1  10048   0  36M   36
8  Tag20198  CTAAC  hffef   1  a  36  -  chr1  10054   0  36M   36
9  Tag45093  CTAAC  hffef   1  a  36  -  chr1  10060   0  36M   36
In [45]:
#if we want to group by the first 3 fields
df.groupby(['v0','v1','v2']).transform(sum).v3
Out[45]:
0    7
1    7
2    7
3    7
4    7
5    7
6    7
7    2
8    2
9    1
Name: v3, dtype: int64
In [46]:
#all it takes is just one line
df['v3']=df.groupby(['v0','v1','v2']).transform(sum).v3
print df
         v0     v1     v2  v3 v4  v5 v6    v7     v8  v9  v10  v11
0  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10006   0  36M   36
1  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10012   0  36M   36
2  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10018   0  36M   36
3  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10024   0  36M   36
4  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10030   0  36M   36
5  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10036   0  36M   36
6  Tag19184  CTAAC  hffef   7  a  36  -  chr1  10042   0  36M   36
7  Tag20198  CTAAC  hffef   2  a  36  -  chr1  10048   0  36M   36
8  Tag20198  CTAAC  hffef   2  a  36  -  chr1  10054   0  36M   36
9  Tag45093  CTAAC  hffef   1  a  36  -  chr1  10060   0  36M   36

【讨论】:

  • 非常感谢!我不熟悉pandas 并且无法打开数据。我在这里发布了另一个问题:stackoverflow.com/questions/24582329/…
  • 我尝试了你的解决方案,但我得到了unsupported operand type(s) for +: 'int' and 'str' :S...我想我需要更多地研究如何使用pandas
  • 您必须使用早期版本,但将.transform(sum). 更改为.transform('count'). 也可以解决问题。
猜你喜欢
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多