2016-04-27 17 views
2

私はこれをきれいに解決しようとしていますが、この作業では非常に失敗しています。複数の列に対応する値を返しますPandas

がポイントに海峡行く...私は2つのデータフレームがあります。

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の列の記録を誘導します。

今、私はdf1anIDsiIDdaID)内のすべての3つの列のための(キーとしてmap_idを使用して)対応renum_id値を得るために、清潔で光/高速な方法が必要です。基本的には、各文字の対応するrenum_IDを私に与えて、0(ゼロ)をdf1に0にしておきます。

だから、私はこのような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

は、私はあなたが最初dictionarydによってdf1to_dict、その後replace値によってdf2dictionaryを作成することができると思います。

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

Awsomeさん:列によってdf1に最終concat新しいDataFramedf3!それは私が必要としたものです! – BrnCPrz

+0

うれしいことができますよ!がんばろう! – jezrael

関連する問題