python - 匹配两个熊猫系列:如何从另一个系列中的一个系列中找到一个字符串元素,然后创建一个新列
问题描述
我目前正在清理汽车排放数据集。这是数据集的样子(仅包括前 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 series' 的任何名称。例如,“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”完全相同的条目。
有谁知道如何解决这个问题?有一个更好的方法吗?
提前非常感谢!
解决方案
你的循环是在正确的轨道上。我能想到的最易读和最直接的方法是:
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
推荐阅读
- sql - PostGIS 扩展未安装
- android - layout_weight 未按预期运行
- view - Odoo 模型函数覆盖无效
- java - JSP 没问题,但 Servlet = 404 资源未找到(IntelliJ)
- python - 您如何使用训练数据估计已知多项式回归模型的参数?
- autohotkey - 自动热键,切换:按住 Shift,每秒单击并释放 LButton
- c# - C# - 使用线程内的 Dispatcher 以编程方式将 RowDefinition 添加到网格
- sql - 对具有不同计数行的许多列求和
- javascript - 我想使用 javascript 在我的网页中隐藏搜索栏
- ios - 金属反馈回路伪影