计算字符串和数字与pandas匹配的行数

2024-05-14 00:52:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我在SAMPLE列中有1-12个数字,对于每个数字,我尝试计算突变数(A:T,C:G等)。这段代码很好用,但是我如何修改代码,让我为每一个变异都有12个条件,而不是为每一个变异写同样的代码12次呢?在

在这个例子中,AT给我一个数字,而SAMPLE=1。我试图得到每个样品编号(1,2,…12)的AT编号。那么如何修改这个代码呢?我很感激你的帮助。非常感谢。在

         SAMPLE                                        MUT
0          11                                 chr1:100154376:G:A
1           2                                 chr1:100177723:C:T
2           9                                 chr1:100177723:C:T
3           1                                chr1:100194200:-:AA
4           8                                  chr1:10032249:A:G
5           2                                 chr1:100340787:G:A
6           1                                 chr1:100349757:A:G
7           3                                  chr1:10041186:C:A
8          10                                 chr1:100476986:G:C
9           4                                 chr1:100572459:C:T
10          5                                 chr1:100572459:C:T
...        ...                                    ...

d= df["SAMPLE", "MUT" ]
chars1 = "TGC-"
number = {}
for item in chars1:
    dm= d[(d["MUT"].str.contains("A:" + item)) & (d["SAMPLE"].isin([1]))]
    num1 = dm.count()
    number[item] = num1

AT=number["T"]
AG=number["G"]
AC=number["C"]
A_=number["-"]

Tags: sample代码number数字dmitem条件at
3条回答

我也有类似的回答

import pandas as pd
df = pd.DataFrame(data={'SAMPLE': [11,2,9,1,8,2,1,3,10,4,5], 'MUT': ['chr1:100154376:G:A', 'chr1:100177723:C:T', 'chr1:100177723:C:T', 'chr1:100194200:-:AA', 'chr1:10032249:A:G', 'chr1:100340787:G:A', 'chr1:100349757:A:G', 'chr1:10041186:C:A', 'chr1:100476986:G:C', 'chr1:100572459:C:T', 'chr1:100572459:C:T']}, columns=['SAMPLE', 'MUT'])
df['Sequence'] = df['MUT'].str.replace(r'\w+:\d+:', '\1')
df.groupby(['SAMPLE', 'Sequence']).count()

生产

^{pr2}$

您可以使用正则表达式替换创建一个具有突变类型(a->;T,G->;C)的列,然后应用pandas groupby进行计数。在

import pandas as pd
import re
df = pd.read_table('df.tsv')
df['mutation_type'] = df['MUT'].apply(lambda x: re.sub(r'^.*?:([^:]+:[^:]+)$', r'\1', x))
df.groupby(['SAMPLE','mutation_type']).agg('count')['MUT']

数据的输出如下:

^{pr2}$

我会使用熊猫的原生字符串提取方法

df.MUT.str.extract('A:(T)|A:(G)|A:(C)|A:(-)')

返回不同组的匹配项:

^{pr2}$

然后我将使用pd.isnull将其转换为True或{},并用~将其反转。从而在匹配的地方得到正确的结果,在没有匹配的地方得到错误的结果。在

^{3}$

然后将其分配给数据帧

df[["T","G","C","-"]] = ~pd.isnull(df.MUT.str.extract('A:(T)|A:(G)|A:(C)|A:(-)'))

    SAMPLE                  MUT      T      G      C      -
0       11   chr1:100154376:G:A  False  False  False  False
1        2   chr1:100177723:C:T  False  False  False  False
2        9   chr1:100177723:C:T  False  False  False  False
3        1  chr1:100194200:-:AA  False  False  False  False
4        8    chr1:10032249:A:G  False   True  False  False
5        2   chr1:100340787:G:A  False  False  False  False
6        1   chr1:100349757:A:G  False   True  False  False
7        3    chr1:10041186:C:A  False  False  False  False
8       10   chr1:100476986:G:C  False  False  False  False
9        4   chr1:100572459:C:T  False  False  False  False
10       5   chr1:100572459:C:T  False  False  False  False

现在我们可以简单地将列相加:

df[["T","G","C","-"]].sum()
T    0
G    2
C    0
-    0

但是等等,我们并不是只在SAMPLE == 1的地方这样做的

我们可以很容易地使用面具:

sample_one_mask = df.SAMPLE == 1
df[sample_one_mask][["T","G","C","-"]].sum()
T    0
G    1
C    0
-    0

如果您想让它为每个样本计数,可以使用groupby函数:

df[["SAMPLE","T","G","C","-"]].groupby("SAMPLE").agg(sum).astype(int)

        T  G  C  -
SAMPLE            
1       0  1  0  0
2       0  0  0  0
3       0  0  0  0
4       0  0  0  0
5       0  0  0  0
8       0  1  0  0
9       0  0  0  0
10      0  0  0  0
11      0  0  0  0

TLDR

这样做:

^{8}$

相关问题 更多 >