【问题标题】:Matching two pandas series: How to find a string element from one series in another series and then create a new column匹配两个熊猫系列:如何从另一个系列中的一个系列中找到一个字符串元素,然后创建一个新列
【发布时间】:2020-05-29 07:59:21
【问题描述】:

我目前正在清理汽车排放数据集。这是数据集的样子(仅包括前 10 行):

import pandas as pd

cars_em_df = pd.DataFrame({'manufacturer_name_mapped': ['FIAT', 'FIAT','FIAT','FIAT','FIAT'],
'commercial_name':['124 gt multiair auto', '500l wagon pop star t-jet', 
'doblo combi 1.4 95', 'panda  0.9t sge 85 natural power', 'punto 1.4  77 lpg'],
'fuel_type_mapped':['Petrol', 'Petrol', 'Petrol', 'NG-Biomethane', 'LPG'],
'file_year':[2018, 2018, 2018, 2018, 2018], 'emissions': [153,158,165,86,114]})

我最感兴趣的是列'commercial_name'。最终目标是在此数据框中添加另一列,显示 'commercial_name' 的“清理”版本。我有一个单独的熊猫系列,其中包含应该使用的“正确”名称,而不是这些“凌乱”的名称。

real_model_names = pd.Series(['uno', '147', 'panda', 'punto', '166', '4c', 'brera', 'giulia',
'giulietta', 'gtv'])

这些也是字符串。例如,我想在 'commercial_name' 的每一行中查找它是否包含 'real_model_names 系列' 中的任何名称。例如。 'real_model_names''punto' 可在 'commercial_name' 的条目 'punto 1.4 77 lpg' 中找到强>列。那么我希望(在 car_em_df 的新列中)旁边有 'punto'。如果找不到,我希望显示原始的“混乱”名称。

我尝试定义一个函数,然后将其应用于“commercial_name”列。我试过这个:

def str_ops(series):
   for i in real_model_names:
      if i in series:
         return series.replace(series, i)
      else:
         return series

下一步,我将应用此函数并将其作为新列添加到数据框中:

commercial_name_cleaned = cars_em_df.commercial_name.apply(str_ops)
cars_em_df.insert(3,value=commercial_name_cleaned,column='commercial_name_cleaned') 

但是,这并没有做任何事情。新列只显示与“commercial_name”完全相同的条目。

有谁知道如何解决这个问题?有一个更好的方法吗?

提前非常感谢!

【问题讨论】:

    标签: python pandas mapping data-cleaning


    【解决方案1】:

    您的循环在正确的轨道上。我能想到的最易读和最直接的方法:

    def str_ops(x):
        for y in real_model_names: 
            if y in x: 
                return y 
        return x
    
    cars_em_df['commercial_name_cleaned'] = cars_em_df['commercial_name'].apply(str_ops)
    
    # Result
    cars_em_df
      manufacturer_name_mapped                   commercial_name fuel_type_mapped  file_year  emissions    commercial_name_cleaned
    0                     FIAT              124 gt multiair auto           Petrol       2018        153       124 gt multiair auto
    1                     FIAT         500l wagon pop star t-jet           Petrol       2018        158  500l wagon pop star t-jet
    2                     FIAT                doblo combi 1.4 95           Petrol       2018        165         doblo combi 1.4 95
    3                     FIAT  panda  0.9t sge 85 natural power    NG-Biomethane       2018         86                      panda
    4                     FIAT                 punto 1.4  77 lpg              LPG       2018        114                      punto
    

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 2017-01-25
      • 1970-01-01
      • 2014-06-26
      • 2016-10-22
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      相关资源
      最近更新 更多