比较2个数据帧与Pandas

2024-05-03 20:01:46 发布

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

这是我第一次使用熊猫,我真的不知道如何处理我的问题。你知道吗

事实上,我有两个数据帧:

import pandas 

blast=pandas.read_table("blast")
cluster=pandas.read_table("cluster")

以下是其内容的示例:

 >>> cluster
       cluster_name            seq_names
0                 1           g1.t1_0035
1                 1      g1.t1_0035_0042
2            119365           g1.t1_0042
3             90273      g1.t1_0042_0035
4             71567          g10.t1_0035
5             37976     g10.t1_0035_0042
6             22560          g10.t1_0042
7             90280     g10.t1_0042_0035
8             82698         g100.t1_0035
9             47392    g100.t1_0035_0042
10            28484         g100.t1_0042
11            22580    g100.t1_0042_0035
12            19474        g1000.t1_0035
13             5770   g1000.t1_0035_0042
14            29708        g1000.t1_0042
15            99776   g1000.t1_0042_0035
16             6283       g10000.t1_0035
17            39828  g10000.t1_0035_0042
18            25383       g10000.t1_0042
19           106614  g10000.t1_0042_0035
20             6285       g10001.t1_0035
21            13866  g10001.t1_0035_0042
22           121157       g10001.t1_0042
23           106615  g10001.t1_0042_0035
24             6286       g10002.t1_0035
25              113  g10002.t1_0035_0042
26            25397       g10002.t1_0042
27           106616  g10002.t1_0042_0035
28             4643       g10003.t1_0035
29            13868  g10003.t1_0035_0042
...             ...                  ...

以及

    [78793 rows x 2 columns]
    >>> blast
                      qseqid               sseqid  pident  length  mismatch  \
0            g1.t1_0035_0042      g1.t1_0035_0042   100.0     286         0   
1            g1.t1_0035_0042           g1.t1_0035   100.0     257         0   
2            g1.t1_0035_0042        g9307.t1_0035    26.9     134        65   
3            g2.t1_0035_0042      g2.t1_0035_0042   100.0     445         0   
4            g2.t1_0035_0042           g2.t1_0035    95.8     451         3   
5            g2.t1_0035_0042  g24520.t1_0042_0035    61.1     429       137   
6            g2.t1_0035_0042        g9924.t1_0042    61.1     429       137   
7            g2.t1_0035_0042        g1838.t1_0035    86.2      29         4   
8            g3.t1_0035_0042      g3.t1_0035_0042   100.0     719         0   
9            g3.t1_0035_0042           g3.t1_0035    84.7     753        62   
10           g4.t1_0035_0042      g4.t1_0035_0042   100.0     242         0   
11           g4.t1_0035_0042           g3.t1_0035    98.8     161         2   
12           g5.t1_0035_0042      g5.t1_0035_0042   100.0     291         0   
13           g5.t1_0035_0042           g3.t1_0035    93.1     291         0   
14           g6.t1_0035_0042      g6.t1_0035_0042   100.0     152         0   
15           g6.t1_0035_0042           g4.t1_0035   100.0     152         0   
16           g7.t1_0035_0042      g7.t1_0035_0042   100.0     216         0   
17           g7.t1_0035_0042           g5.t1_0035    98.1     160         3   
18           g7.t1_0035_0042       g11143.t1_0042    46.5     230        99   
19           g7.t1_0035_0042  g27537.t1_0042_0035    40.8     233       111   
20        g3778.t1_0035_0042   g3778.t1_0035_0042   100.0      86         0   
21        g3778.t1_0035_0042        g6174.t1_0035    98.0      51         1   
22        g3778.t1_0035_0042  g20037.t1_0035_0042   100.0      50         0   
23        g3778.t1_0035_0042       g37190.t1_0035   100.0      50         0   
24        g3778.t1_0035_0042  g15112.t1_0042_0035    66.0      53        18   
25        g3778.t1_0035_0042        g6061.t1_0042    66.0      53        18   
26       g18109.t1_0035_0042  g18109.t1_0035_0042   100.0      86         0   
27       g18109.t1_0035_0042       g33071.t1_0035   100.0      81         0   
28       g18109.t1_0035_0042       g32810.t1_0035    96.4      83         3   
29       g18109.t1_0035_0042  g17982.t1_0035_0042    98.6      72         1   
...                      ...                  ...     ...     ...       ... 

如果您继续关注集群数据库,那么第一列对应于集群ID,在这些集群中有几个序列ID。 我需要做的是首先拆分我的所有集群(在R中是这样:liste=split(x = data$V2, f = data$V1)

然后,创建一个函数来显示每个簇中最相似的paires序列。 举个例子:

假设我有两个集群(dataframe集群):

cluster 1: 
seq1
seq2
seq3
seq4
cluster 2:
seq5
seq6
seq7

。。。你知道吗

在blast数据帧的第3列中,所有序列之间存在相似性(所有对所有),因此类似于:

seq1 vs seq1 100
seq1 vs seq2 90
seq1 vs seq3 56
seq1 vs seq4 49
seq1 vs seq5 40
....
seq2 vs seq3 70
seq2 vs seq4 98
...
seq5 vs seq5 100
seq5 vs seq6 89
seq5 vs seq7 60
seq7 vs seq7 46
seq7 vs seq7 100
seq6 vs seq6 100

我需要的是:

cluster 1 (best paired sequences): 
seq 1 vs seq 2

cluster2 (best paired sequences):
seq 5 vs seq6

。。。你知道吗

如你所见,我不想考虑序列本身

如果有人能给我一些线索那就太好了。你知道吗

谢谢大家。你知道吗


Tags: 集群vsclustert1blastg1g2g7
2条回答

首先,我假设blast中没有来自两个不同簇的序列的配对。换句话说:在这个解决方案中,配对的集群ID将只由两个序列ID中的一个来计算。你知道吗

将群集信息和配对信息包含到一个数据帧中:

data = cluster.merge(blast, left_on='seq_names', right_on='qseqid')

数据的配对只能包含不同的配对:

data = data[data['qseqid']!=data['sseqid']]

要忽略seqid中具有相同子字符串的配对,最可读的方法是添加包含以下数据的数据列:

data['qspec'] = [seqid.split('_')[1] for seqid in data['qseqid'].values]
data['sspec'] = [seqid.split('_')[1] for seqid in data['sseqid'].values]

现在,可以用与上面相同的seqid相同的方法过滤相同的spec值:

data = data[data['qspec']!=data['sspec']]

最后,数据应按群集ID分组,在每个组中,pident的最大值是:

data_grpd = data.groupby('cluster_name')
result = data.loc[data_grpd['pident'].idxmax()]

这里唯一的缺点-除了上面提到的假设-是,如果有几个完全相等的最大值,其中只有一个将被考虑在内。你知道吗

注意:如果不希望spec列的类型为string,可以轻松地将它们转换为整数:

import numpy as np
data['qspec'] = [np.int(seqid.split('_')[1]) for seqid in data['qseqid'].values]

这将首先基于sseqid、然后基于qseqid合并数据帧,然后返回结果。任何100%匹配的都会被过滤掉。让我知道这是否有效。然后可以按集群名称排序。你知道吗

blast = blast.loc[blast['pident'] != 100]
results_df = cluster.merge(blast, left_on='seq_names',right_on='sseqid')
results_df = results_df.append(cluster.merge(blast, left_on='seq_names',right_on='qseqid'))

相关问题 更多 >