2017-08-30 4 views
0

複数のレベルのマネージャーを持つ従業員を表示する私のdf(先の質問hereを参照)から、マネージャーIDに基づいて行を部門IDにマップしたいPythonは、列の範囲内の一致に基づいて辞書から値を書き出します

eid, mid, l2mid l3mid 
111, 112, 116, 115 
113, 114, 115, 0 
112, 117, 114, 0 
110, 115, 0,  0  
116, 118, 0,  0 

[編集:複数の列を横切るiが取得する複数の列を検索する必要があることを反映するようにEID = 112のために変更された行:EID = 110の行を反映するように設定補正データが 編集#2を削除されます辞書で一致する]

辞書は

です。
country = {112: 'US', 114: 'Ireland', 118: 'Mexico'} 

私はマネージャーの列 'mid'を検索するPythonを書いてください: 'l3mid'とし、国の文字列の値を新しい列に書き込みます。私は彼らが辞書の国のコードの1つからマネージャーを持っていない場合、行を削除したいと思います。だから、私が探している出力は、次のとおりです。私はこれを行うための機能を構築しようとしているが、かなりの構文を把握することはできません

eid, mid, l2mid l3mid country 
111, 112, 116, 115, US 
113, 114, 115, 0,  Ireland 
112, 117, 114, 0  Ireland 
116, 118, 0,  0  Mexico 

。私はあなたの助けに感謝します。

答えて

3

マネージャの列(半ば、l2mid、l3mid)値が辞書のキーに一致する場合、私は解決策を追加し、その後、値が,によって分割さ結合されている:

s = df.drop('eid',1).applymap(country.get) 
     .dropna(how='all', axis=0) 
     .apply(lambda x: ', '.join(x.dropna()), 1) 

df = df.loc[s.index].assign(country=s) 
print (df) 
    eid mid l2mid l3mid   country 
0 111 112 114 115   US, Ireland 
1 113 114 115  0   Ireland 
2 112 114 118  0   Ireland 
4 116 118  0  0   Mexico 
+2

この答えはあまりにもdownvotedされたのはなぜ?それは完全に正しいです。 (+1) –

+1

質問の私の要約によれば、今この答えは完璧です。あなたはあまりにも複数の一致するケースを追加することはできません。だから誰もが適用の意義を知っているだろう。 – Dark

+1

@Bharathshetty - ありがとうございました – jezrael

関連する問題