2017-07-19 1 views
1

私はmapの値をシリーズの一定の値にしようとしていますが、他のものはそのままです。この場合、dmso --> dmso-2,naoh --> naoh-2water --> water-2を変更しましたが、KeyErrorが表示されています。パンダシリーズに.map付きネストされた辞書を使用するにはどうすればいいですか? pd.Series([])map

まず、ブール値の文を実行して、Trueの場合はFalseの場合はxを返します。私は手動で行って変更することができましたが、プログラミングは面白くて、なぜこのロジックが機能しないのかわかりません。

# A sample of the series 
Se_data = pd.Series({ 
    'DMSO_S43': 'dmso', 
    'DMSO_S44': 'dmso', 
    'DOXYCYCLINE-HYCLATE_S25': 'doxycycline-hyclate', 
    'DOXYCYCLINE-HYCLATE_S26': 'doxycycline-hyclate' 
}) 

# This boolean works 
Se_data.map(lambda x: x in {"dmso", "naoh", "water"}) 
# DMSO_S43       True 
# DMSO_S44       True 
# DOXYCYCLINE-HYCLATE_S25   False 
# DOXYCYCLINE-HYCLATE_S26   False 

# This dictionary on the boolean works 
Se_data.map(lambda x: {True: "control", False: x}[x in {"dmso", "naoh", "water"}]) 
# DMSO_S43           control 
# DMSO_S44           control 
# DOXYCYCLINE-HYCLATE_S25    doxycycline-hyclate 
# DOXYCYCLINE-HYCLATE_S26    doxycycline-hyclate 

# This nested dictionary isn't working 
Se_data.map(lambda x: { 
    True: {"dmso": "dmso-2", "naoh": "naoh-2", "water": "water-2"}[x], 
    False: x 
}[x in {"dmso", "naoh", "water"}]) 
# KeyError: 'doxycycline-hyclate' 

答えて

1

私が正しく理解している場合は、そのまま他のすべての値のままになるだけで

Se_data.replace({ 
    'dmso': 'dmso-2', 
    'naoh': 'naoh-2', 
    'water': 'water-2', 
}) 

を行うことができます。表現

{"dmso": "dmso-2", "naoh": "naoh-2", "water": "water-2"}[x] 

だけではなくx in {"dmso", "naoh", "water"}すべてxのために評価されるので、それは価値がある何のため


は、あなたのコードは働いていませんでした。 Python辞書の値は、短絡されていないか、期待どおりにゆっくりと評価されません。あなたは

Se_data.map(lambda x: { 
    "dmso": "dmso-2", 
    "naoh": "naoh-2", 
    "water": "water-2" 
}[x] if x in {"dmso", "naoh", "water"} else x) 

または

Se_data.map(lambda x: { 
    "dmso": "dmso-2", 
    "naoh": "naoh-2", 
    "water": "water-2" 
}.get(x, x)) 
+0

うわーようなものを行っている可能性があり、これはちょうど私の不満の多くを保存しました。ありがとうございました。私の解決策は少しエレガントな笑だった。 (x): 返信d [x] else: 返信x''' –

関連する問題