【问题标题】:How to use a nested dictionary with .map for a Pandas Series? pd.Series([]).map如何将嵌套字典与 .map 一起用于 Pandas 系列? pd.Series([]).map
【发布时间】:2017-12-24 01:08:31
【问题描述】:

我正在尝试map 系列的某些值,同时保持其他值不变。在这种情况下,我将更改 dmso --> dmso-2naoh --> naoh-2water --> 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'

【问题讨论】:

    标签: python pandas dictionary vector mapping


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2015-07-27
    • 2022-01-14
    相关资源
    最近更新 更多