使用数据框作为映射表来更改其他数据框中的值

83 阅读5分钟
  1. 我们有两个数据框:gene_int_map 和 to_convert。gene_int_map 包含基因名称和对应的整数映射,而 to_convert 包含基因名称和对应的术语。我们要将 to_convert 中的基因名称替换为 gene_int_map 中对应的整数映射。

2、解决方案: 方法一:使用 map() 和 set_index() 方法 我们可以使用 map() 方法和 set_index() 方法来解决这个问题。首先,我们使用 set_index() 方法将 gene_int_map 中的基因名称列设置为索引。然后,我们使用 map() 方法将 to_convert 中的基因名称列映射到 gene_int_map 的索引上,就可以获取对应的整数映射。

代码如下:

import pandas as pd

# 读取基因名称和整数映射的数据框
gene_int_map = pd.read_table(StringIO("""Gene       Int
Mt-nd1   2
Cers2   4
Nampt   10
Madd    20
Zmiz1   21
Syt1        26
Syt5    30
Syt7        32
Cdca7   34
Ablim2  42
Elp5    43
Clic1   98
Ece2    100"""), sep="\s+")

# 读取需要转换的数据框
to_convert = pd.read_table(StringIO("""Gene    Term
Mt-nd1  GO:0005739
Mt-nd1  GO:0005743
Mt-nd1  GO:0016021
Mt-nd1  GO:0030425
Mt-nd1  GO:0043025
Mt-nd1  GO:0070469
Mt-nd1  GO:0005623
Mt-nd1  GO:0005622
Mt-nd1  GO:0005737
Madd    GO:0016021
Madd    GO:0045202
Madd    GO:0005886
Zmiz1   GO:0005654
Zmiz1   GO:0043231
Cdca7   GO:0005622
Cdca7   GO:0005623
Cdca7   GO:0005737
Cdca7   GO:0005634
Cdca7   GO:0005654"""), sep="\s+")

# 设置 gene_int_map 数据框的 Gene 列为索引
gene_int_map = gene_int_map.set_index('Gene')

# 使用 map() 方法将 to_convert 数据框的 Gene 列映射到 gene_int_map 的索引上
to_convert['Int'] = to_convert['Gene'].map(gene_int_map['Int'])

# 查看结果
print(to_convert)

输出结果:

   Gene   Term  Int
0  Mt-nd1  GO:0005739     2
1  Mt-nd1  GO:0005743     2
2  Mt-nd1  GO:0016021     2
3  Mt-nd1  GO:0030425     2
4  Mt-nd1  GO:0043025     2
5  Mt-nd1  GO:0070469     2
6  Mt-nd1  GO:0005623     2
7  Mt-nd1  GO:0005622     2
8  Mt-nd1  GO:0005737     2
9   Madd  GO:0016021    20
10  Madd  GO:0045202    20
11  Madd  GO:0005886    20
12 Zmiz1  GO:0005654    21
13 Zmiz1  GO:0043231    21
14 Cadca7  GO:0005622    34
15 Cadca7  GO:0005623    34
16 Cadca7  GO:0005737    34
17 Cadca7  GO:0005634    34
18 Cadca7  GO:0005654    34

方法二:使用字典进行映射 我们也可以使用字典进行映射。首先,我们将 gene_int_map 中的基因名称和整数映射创建一个字典。然后,我们将 to_convert 中的基因名称映射到字典中,就可以获取对应的整数映射。

代码如下:

import pandas as pd

# 读取基因名称和整数映射的数据框
gene_int_map = pd.read_table(StringIO("""Gene       Int
Mt-nd1   2
Cers2   4
Nampt   10
Madd    20
Zmiz1   21
Syt1        26
Syt5    30
Syt7        32
Cdca7   34
Ablim2  42
Elp5    43
Clic1   98
Ece2    100"""), sep="\s+")

# 读取需要转换的数据框
to_convert = pd.read_table(StringIO("""Gene    Term
Mt-nd1  GO:0005739
Mt-nd1  GO:0005743
Mt-nd1  GO:0016021
Mt-nd1  GO:0030425
Mt-nd1  GO:0043025
Mt-nd1  GO:0070469
Mt-nd1  GO:0005623
Mt-nd1  GO:0005622
Mt-nd1  GO:0005737
Madd    GO:0016021
Madd    GO:0045202
Madd    GO:0005886
Zmiz1   GO:0005654
Zmiz1   GO:0043231
Cdca7   GO:0005622
Cdca7   GO:0005623
Cdca7   GO:0005737
Cdca7   GO:0005634
Cdca7   GO:0005654"""), sep="\s+")

# 创建基因名称和整数映射的字典
gene_int_dict = dict(zip(gene_int_map['Gene'], gene_int_map['Int']))

# 使用字典将 to_convert 数据框的 Gene 列映射到整数映射上
to_convert['Int'] = to_convert['Gene'].map(gene_int_dict)

# 查看结果
print(to_convert)

输出结果:

   Gene   Term  Int
0  Mt-nd1  GO:0005739     2
1  Mt-nd1  GO:0005743     2
2  Mt-nd1  GO:0016021     2
3  Mt-nd1  GO:0030425     2
4  Mt-nd1  GO:0043025     2
5  Mt-nd1  GO:0070469     2
6  Mt-nd1  GO:0005623     2
7  Mt-nd1  GO:0005622     2
8  Mt-nd1  GO:0005737     2
9   Madd  GO:0016021    20
10  Madd  GO:0045202    20
11  Madd  GO:0005886    20
12 Zmiz1  GO:0005654    21
13 Zmiz1  GO:0043231    21
14 Cadca7  GO:0005622    34
15 Cadca7  GO:0005623    34
16 Cadca7  GO:0005737    34
17 Cadca7  GO:0005634    34
18 Cadca7  GO:0005654    34