2017-08-23 9 views
1

同じカテゴリに属する​​が名前が異なる値を含むデータセットがあります。私は、複数の値に割り当てられたキーを持つ辞書を作成し、その列の値をキーで置き換えることを考えていました。ここに私が持っているものと私が達成したいものがあります。python:辞書のキーに複数の値を割り当て、列の値をキーで置き換えます。

辞書

sspdict={'Eva':["M-EV", "G-EV"],'Re Sci': ['G-RESC', 'M-RESC', 'S-RESC', 'D-RESC'], 'Ed':['G-PO' , 'M-PO'], 'Global':['C-GCC', 'D-GCLA', 'C-LACL']} 

データセットの定義:あなたは親切に助けてくださいすることができ

Col1 Col2 Col3 
12 No  M-EV 
22 Yes G-EV 
23 Yes G-RESC 
35 No  M-PO 
34 Yes D-GCLA 
46 No  S-RESC 
89 No  G-PO 
90 Yes C-GCC 

望ましい結果

Col1 Col2 Col3 
12 No  Eva 
22 Yes Eva 
23 Yes Re Sci 
35 No  Ed 
34 Yes Global 
46 No  Re Sci 
89 No  Ed 
90 Yes Global 

を?

答えて

1

df.assign(Col3 = df['Col3'].apply(lambda x: [key for key, value in sspdict.items() if x in value][0])) 

それともさんは、発電機を使用してみましょう:

df.assign(Col3 = df['Col3'].apply(lambda x: next(key for key, value in sspdict.items() if x in value))) 

出力:

Col1 Col2 Col3 
0 12 No  Eva 
1 22 Yes  Eva 
2 23 Yes Re Sci 
3 35 No  Ed 
4 34 Yes Global 
5 46 No Re Sci 
6 89 No  Ed 
7 90 Yes Global 
+0

美しいワンライナー。私の考えよりも仕事が良かったのですか?ありがとうヒープScott – Omido

+0

別のデータセットでone-linerを使用しようとしましたが、このエラーが発生します:IndexError:リストのインデックスが範囲外です。あなたはこれを引き起こす原因を知っていますか?また、one-liner内のappyメソッドで[0]を使用する理由は何ですか? Thanks heaps – Omido

+0

[0]リストから値を取得しますか?適用の中では、リストの理解を使用しているので、リストを作成してそのリストからその最初の値を取得し、[0]を続けます。 –

0

sspdictが入力データセットより大きくない場合は、データ構造を簡略化し、おそらくパフォーマンスを向上させるために、sspdictデータ構造を変更することをお勧めします。のは、このワンライナーを試してみましょう

dataset = '''Col1 Col2 Col3 
12 No  M-EV 
22 Yes G-EV 
23 Yes G-RESC 
35 No  M-PO 
34 Yes D-GCLA 
46 No  S-RESC 
89 No  G-PO 
90 Yes C-GCC 
''' 

sspdict = {'Eva':["M-EV", "G-EV"],'Re Sci': ['G-RESC', 'M-RESC', 'S-RESC', 'D-RESC'], 'Ed':['G-PO' , 'M-PO'], 'Global':['C-GCC', 'D-GCLA', 'C-LACL']} 

lookup_dict = {value: key for key, values in sspdict.items() for value in values} 
result = '' 
for line in dataset.splitlines()[1:]: 
    key = line.split()[2] 
    result += line.rstrip(key) + lookup_dict[key] + '\n' 

print(result) 
+0

グレートそれはこのようなものかもしれませんメソッドgsi-frank。私はシンプルさのために下の1ライナーと一緒に行きました – Omido

関連する問題