【问题标题】:Using relaxed dictionary to map values in column使用宽松字典映射列中的值
【发布时间】:2023-04-06 17:43:01
【问题描述】:

我想知道是否有人可以帮助我将一列字符串与 python 中的一种轻松字典匹配。所以我有以下python数据框:

String                      Colour
8392apple8309
8dbsfhorange9anld
38banananflks9

还有这本词典:

_dict
{'apple':'Red',
'orange':'Orange'
'banana':'Yellow'}

我写了这个函数:

def fruitsearch(string):
    return [value for key, value in _dict.items() if string in key.lower()]

它能够获取我的键的子字符串,例如fruitsearch('app') 并返回正确的颜色,红色。然而,我想做的是让函数在我的数据框列“字符串”中找到键,并将正确的颜色返回到数据框中的第二列颜色,所以它看起来像这样:

String                        Colour
8392apple8309                 Red
8dbsfhorange9anld             Orange
38banananflks9                Yellow

谢谢!

【问题讨论】:

    标签: python string pandas dictionary series


    【解决方案1】:

    这是一种方法。

    演示:

    import pandas as pd
    
    
    def fruitsearch(string):
        _dict = {'apple':'Red', 'orange':'Orange', 'banana':'Yellow'}
        for key, value in _dict.items():
            if key.lower() in string:
                return value 
        return None
    
    
    df = pd.DataFrame({"String": ["8392apple8309", "8dbsfhorange9anld", "38banananflks9"]})
    df["Colour"] = df["String"].apply(fruitsearch)
    
    print(df)
    

    输出:

                  String  Colour
    0      8392apple8309     Red
    1  8dbsfhorange9anld  Orange
    2     38banananflks9  Yellow
    

    【讨论】:

      【解决方案2】:

      目前您正在逐行计算中迭代您的字典。为了提高效率,尤其是在有大量行的情况下,请考虑对每个字典项进行按列 操作。在这种情况下,您可以使用pd.Series.str.contains 并提供参数regex=False 来提高性能。

      for k, v in _dict.items():
          df.loc[df['String'].str.contains(k, regex=False), 'Colour'] = v
      
      print(df)
      
                    String  Colour
      0      8392apple8309     Red
      1  8dbsfhorange9anld  Orange
      2     38banananflks9  Yellow
      

      【讨论】:

      • 感谢您的建议,这真的很有帮助!
      猜你喜欢
      • 2011-10-18
      • 2021-12-27
      • 2021-08-02
      • 2018-09-21
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多