【问题标题】:How to replace dataframe column values with dictionary keys?如何用字典键替换数据框列值?
【发布时间】:2018-01-28 23:02:41
【问题描述】:

假设我有一本字典:

dict = {"1" : "A", "2" : "B" , "3" : "C"}

和一个数据框

df = pd.DataFrame()
df["ID"] = pd.Series(["A","B","C"])
df["Desc"] = pd.Series(["Fruits","Vegs","Meat"])

数据框将如下所示:

如何将df["ID"] 列中的值替换为字典键,以便df["ID"] 中有1,2,3 而不是A,B,C

【问题讨论】:

    标签: python pandas dataframe replace


    【解决方案1】:

    首先创建一个反向映射:

    In [363]: dict2 = {v : k for k, v in dict_.items()}
    

    这里的假设是您的价值观是独一无二的。现在你可以使用pd.Series.replace

    In [367]: df.ID = df.ID.replace(dict2); df
    Out[367]: 
      ID    Desc
    0  1  Fruits
    1  2    Vegs
    2  3    Meat
    

    pd.Series.map 的替代解决方案:

    In [380]: df.ID = df.ID.map(dict2); df
    Out[380]: 
      ID    Desc
    0  1  Fruits
    1  2    Vegs
    2  3    Meat
    

    另外,我建议您使用与dict 不同的名称,因为已经有一个具有该名称的内置函数。

    【讨论】:

    • 如果你的字典中的值是一个列表,你会怎么做?假设您在原始数据框中找到要替换为键下列表中的值的值。您将如何用该密钥替换它?我试过你的方法,但第一行给了我这个错误:TypeError: unhashable type: 'list'
    • @florence-y 我想了解更多信息。你能用minimal reproducible example 开一个新问题并将我链接到它吗?我认为您可能需要使用列表理解,但如果不进行一些测试,我无法确定。
    • 我自己设法解决了这个问题——我玩了一会儿,得到了用dict2 = {keys: old_keys for old_keys, old_values in dict.items() for keys in old_values} 切换的键和值,然后用df.columnheader.replace(dict2) 得到我需要的东西。这个问题here 帮助了我,然后我使用了pd.Series.replace。谢谢!
    【解决方案2】:

    或者你可以只基于 pandas 。

    df.ID=df.ID.map((pd.DataFrame(data=d,index=['Value',]).T.reset_index().set_index('Value'))['index'])
    
    Out[23]: 
      ID    Desc
    0  1  Fruits
    1  2    Vegs
    2  3    Meat
    

    【讨论】:

      【解决方案3】:

      另一种方法是:

      dict1 = pd.DataFrame(dict.items())
      dict1.columns = ['ID_1',"ID"]
      merge = pd.merge(df,dict1)
      del merge['ID']
      merge = merge.rename(columns={'ID_1': 'ID'})
      
          Desc    ID
      0   Fruits  1
      1   Vegs    2
      2   Meat    3
      

      【讨论】:

        猜你喜欢
        • 2021-12-12
        • 2022-11-01
        • 2019-11-18
        • 2021-07-13
        • 2022-08-21
        • 2018-03-08
        • 2018-08-07
        • 2020-02-12
        • 1970-01-01
        相关资源
        最近更新 更多