【问题标题】:access dictionary inside a function using python使用python访问函数内部的字典
【发布时间】:2023-03-19 03:59:01
【问题描述】:

所以我遇到的问题是,我不确定如何在函数中调用字典。

>>> play = pd.DataFrame(play)
>>> play
      No      Yes
0  Wednesday   Monday
1   Thursday  Tuesday
2   Saturday   Friday
>>> days = 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'

>>> newdict = {}
>>> numbincrease = 0
>>> for i in days:
        newdict[i] = numbincrease
        numbincrease = numbincrease + 1


>>> print(newdict)
{'Monday': 0, 'Tuesday': 1, 'Wednesday': 2, 'Thursday': 3, 'Friday': 4, 'Saturday': 5}

所以我想将日期转换为数字,输出应该能够遍历所有列和所有行并读取字典并替换为程序中使用的字典中的适当值。输出应该是这样的,

>>> play
      No      Yes
0     2        0
1     3        1
2     5        4  

我已经搜索了很多方法来做到这一点,但它似乎不起作用。我不知道如何调用一个函数来迭代每一列并将调用字典应用于该值并继续下一行或下一列。 请帮忙,谢谢

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    试试这个,.applymap 遍历数据框中的每一项
    play.applymap(lambda x: newdict[x])


    编辑:@jpp 的建议:
    play.applymap(newdict.get)

    【讨论】:

    • 在我看来,你永远不应该使用play.applymap(lambda x: newdict[x])。这增加了一个额外且不必要的 Python 级函数调用。此外,如果您的字典键中没有任何值,它将失败并显示KeyError
    • @jpp 我想明白你的意思。我的想法是有两个步骤:1. lambda x:2. newdict[x]newdict.get 只是一步。那是对的吗? 旁注,你给了我一个关于使用applymap(和apply/map等)内部函数的灯泡时刻,这使代码更快更容易理解。我要感谢你!
    • 是的,你是对的。 apply 只是一个隐藏循环。它遍历每个值并对其应用一个函数。 lambda x: newdict[x] 实际上是 2 个函数调用:一个用于 lambda,另一个用于从键中获取值。添加函数调用可能会很昂贵。
    • @Jpp 所以你是说与def my_func(): return newdict[x] 一起执行play.applymap(my_func)play.applymap(lambda x: newdict[x]) 更好,因为在我看来它看起来是一样的
    • @Jpp 哦​​,我明白了。我现在知道函数调用是什么意思了,谢谢!
    【解决方案2】:

    pd.DataFrame.applymap 可用于将函数应用于数据帧中的每个值。在这种情况下,适当的函数是dict.get

    请注意,如下所示,您可以使用带有enumerate 的字典推导有效地将天映射到整数。

    days = ('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')
    
    daymap = {v: k for k, v in enumerate(days)}
    
    res = df.applymap(daymap.get)
    
    print(res)
    
       No  Yes
    0   2    0
    1   3    1
    2   5    4
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      play = play.replace(newdict)
      

      replaceapplymap 之间的区别在于,当您的 df 中的元素不在字典中时,replace 元素将保持原样:

      df:

               No       Yes
        Wednesday    Monday
         Thursday   Tuesday
            a day    Friday 
      

      replace:

            No    Yes
      0      2      0
      1      3      1
      2  a day      4
      

      使用applymap,您将拥有NaN

          No  Yes
      0  2.0    0
      1  3.0    1
      2  NaN    4 
      

      【讨论】:

      • 请注意 performance implications, replace 很慢。在大多数情况下,您应该更喜欢df.applymap(foo).fillna(df) 而不是df.replace(foo)。话虽如此,未映射值的问题可能与 OP 的数据无关。
      • @jpp 感谢您指定。我只是想展示一个不同的选项,但我同意applymap 是首选。无论如何,我喜欢你的回答,因为总体上改进了代码,+1
      • @jpp 如果您想处理未映射的值(而不是替换),您会说newdict.get(x, np.nan) 是一个更快的解决方案吗?
      • @Dillon,没错,你可以使用df.applymap(daymap.get)。如果某些内容未映射,它将变为 NoneNaN,您无需使用 Pandas 明确指定替代值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2013-12-03
      • 2015-11-07
      • 2021-12-22
      相关资源
      最近更新 更多