如何将嵌套字典与 .map 一起用于 Pandas 系列? pd.Series([]).map
Posted
技术标签:
【中文标题】如何将嵌套字典与 .map 一起用于 Pandas 系列? pd.Series([]).map【英文标题】:How to use a nested dictionary with .map for a Pandas Series? pd.Series([]).map 【发布时间】:2017-12-24 01:08:31 【问题描述】:我正在尝试map
系列的某些值,同时保持其他值不变。在这种情况下,我将更改 dmso --> dmso-2
、naoh --> naoh-2
和 water --> water-2
,但我得到了 KeyError
。
首先我正在做一个布尔语句,看看它是否是任何感兴趣的,如果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
,而不仅仅是x in "dmso", "naoh", "water"
。 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))
【讨论】:
哇,这让我省了很多挫折。谢谢你。我的解决方案不太优雅,哈哈。def lambda_dict(conditional, d, x): if conditional(x): return d[x] else: return x
以上是关于如何将嵌套字典与 .map 一起用于 Pandas 系列? pd.Series([]).map的主要内容,如果未能解决你的问题,请参考以下文章
用于在 Excel 中导出的嵌套字典的顺序或 pandas 列的顺序 [重复]