2016-04-27 65 views
2

我一直試圖以一種乾淨的方式來解決這個問題,但是在這個任務上一直都失敗了。返回多列中的相應值大熊貓

海峽去給點...我有2個dataframes:

df1 
    anID siID daID 
0  A  0  0 
1  D  0  0 
2  E  0  0 
3  F  0  0 
4  G  A  D 
5  H  E  D 
6  B  0  0 
7  I  E  M 
8  L  F  0 
9  M  B  H 
10  N  A  D 

df2 
    map_id renum_id 
0  A   1 
1  C   2 
2  B   3 
3  E   4 
4  D   5 
5  F   6 
6  Q   7 
7  V   8 
8  H   9 
9  G  10 
10  N  11 

基本上,df1是識別碼的數據幀,df2$renum_id有新的代碼來替換現有和df2$map_id是地圖上的哪個以指導df1的列的重新編碼。

現在我需要一個乾淨的和光/快速的方式來獲得相應的renum_id值(使用map_id作爲密鑰)對所有3列df1anIDsiIDdaID)。基本上,我希望它爲每個字母提供相應的renum_ID,並將0(零)保留爲df1中的零。

所以,我需要一個df3這樣的:

 anID siID daID anID/ siID/ daID/ 
0  A  G  0  1  10  0 
1  D  E  A  5  4  1  
2  E  0  0  4  0  0 
3  F  B  D  6  3  5 
4  G  A  D  10  1  5 
5  H  E  D  9  4  5   
6  B  0  0  2  0  0  
7  N  A  D  11  1  5 

這也可能是很簡單的東西,但我一直在試圖與pd.merge,不能拿出一些解決我的問題。數據幀擁有數十萬行數據,這就是爲什麼我堅持需要「輕量級」的方式來解決這個問題。

謝謝大家提前。

回答

1

我想你可以通過在df1to_dict然後replace值由dictionaryd首先創建dictionarydf2。按列最後concatDataFramedf3df1

d = df2.set_index('map_id').to_dict() 
print d['renum_id'] 
{'A': 1, 'C': 2, 'B': 3, 'E': 4, 'D': 5, 'G': 10, 'F': 6, 'H': 9, 'N': 11, 'Q': 7, 'V': 8} 

df3 = df1.replace(d['renum_id']) 
df3.columns = [col + '/' for col in df3.columns] 
print df3 

    anID/ siID/ daID/ 
0  1  0  0 
1  5  0  0 
2  4  0  0 
3  6  0  0 
4  10  1  5 
5  9  4  5 
6  3  0  0 
7  I  4  M 
8  L  6  0 
9  M  3  9 
10 11  1  5 

print pd.concat([df1, df3], axis=1) 

    anID siID daID anID/ siID/ daID/ 
0  A 0 0  1  0  0 
1  D 0 0  5  0  0 
2  E 0 0  4  0  0 
3  F 0 0  6  0  0 
4  G A D 10  1  5 
5  H E D  9  4  5 
6  B 0 0  3  0  0 
7  I E M  I  4  M 
8  L F 0  L  6  0 
9  M B H  M  3  9 
10 N A D 11  1  5 
+0

要命!這正是我需要的! – BrnCPrz

+0

很高興能爲您提供幫助!祝你好運! – jezrael