我正在尝试映射
一系列值的某些值,同时保持其他值不变。在本例中,我要更改 dmso --> dmso-2
、naoh --> naoh-2
和 water --> water-2
但我收到了 KeyError
。
首先,我正在执行一个 bool 语句来查看它是否是任何感兴趣的,如果 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'
最佳答案
如果我理解正确的话,你可以简单地做
Se_data.replace({
'dmso': 'dmso-2',
'naoh': 'naoh-2',
'water': 'water-2',
})
这将使所有其他值保持不变。
<小时/>无论如何,您的代码无法正常工作,因为表达式
{"dmso": "dmso-2", "naoh": "naoh-2", "water": "water-2"}[x]
针对所有 x
进行评估,而不仅仅是 {"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))
关于python - 如何将嵌套字典与 .map 用于 Pandas 系列? pd.Series([]).map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45179079/