from StringIO import StringIO
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+")
然后,我有另一个数据框,我要将Gene列转换为映射中给定的整数(to_convert中的名称可以覆盖):
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中的整数值替换to_convert中的名称.
我敢肯定这是超级简单,但是似乎没有任何合并选项可以做到.我也无法使用任何布尔型蒙版.
附言我还想用gene_int_map中的整数替换一栏数据框中的值:
simple_series = pd.read_table(StringIO("""Gene
Ablim2
Elp5
Clic1
Ece2"""), squeeze=False)
如果答案足够笼统地包括这种情况,那就太好了.
解决方法:
在gene_int_map的“ Gene”列中调用set_index
,并将其作为参数传递给map
,然后在另一个df的“ Gene”列中进行调用:
In [119]:
to_convert['Gene'].map(gene_int_map.set_index('Gene')['Int'])
Out[119]:
0 2
1 2
2 2
3 2
4 2
5 2
6 2
7 2
8 2
9 20
10 20
11 20
12 21
13 21
14 34
15 34
16 34
17 34
18 34
Name: Gene, dtype: int64
这也适用于您的simple_series:
In [120]:
simple_series['Gene'].map(gene_int_map.set_index('Gene')['Int'])
Out[120]:
0 42
1 43
2 98
3 100
Name: Gene, dtype: int64