2015-06-12 64 views
3

我有一個的大數據幀充當整數和名之間的映射更改值:如何使用數據幀的映射到另一個數據幀

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名稱。

我相信這是超級簡單的,但似乎沒有合併選項的排列會做到這一點。我無法獲得任何布爾型掩碼。

Ps。我也想替換gene_int_map在一列數據幀與整數值:

simple_series = pd.read_table(StringIO("""Gene 
Ablim2 
Elp5 
Clic1 
Ece2"""), squeeze=False) 

這將是很好,如果答案是足夠一般包括這種情況。在gene_int_map的「基因」列

回答

2

呼叫set_index,並通過以此爲參數去map和你的其他DF稱之爲你的「基因」欄:

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 
1

也許你可以創建就像一本字典:

dictionary = dict(zip(gene_int_map.Gene, gene_int_map.Int)) 

然後替換值(使用map由@EdChum所建議的):

to_convert['Gene'].map(dictionary) 

具有之前創建將加速映射的詞典。

+0

'AttributeError:'DataFrame'對象沒有屬性'map''你以前的答案似乎工作。 –

+0

@TheUnfunCat:我改變了它,因爲'map'比'replace'更快,同時仍然允許使用字典,在我看來它非常乾淨和直接。無論如何,你不應該因爲最新的變化而導致錯誤。 :-) – Peque

+0

我真的開始喜歡這個答案了,謝謝! –