Python 匹配两个系列:如何从另一个系列中的一个系列中查找字符串元素,然后创建新列
我目前正在清理汽车排放数据集。这是数据集的外观(仅包括前10行): 我最感兴趣的是专栏“商业名称”。最终目标是在此数据框中添加另一列,显示'commercial\u name'的“清理”版本。我有一个单独的熊猫系列,其中包含应该使用的“正确”名称,而不是这些“混乱”的名称Python 匹配两个系列:如何从另一个系列中的一个系列中查找字符串元素,然后创建新列,python,pandas,mapping,data-cleaning,Python,Pandas,Mapping,Data Cleaning,我目前正在清理汽车排放数据集。这是数据集的外观(仅包括前10行): 我最感兴趣的是专栏“商业名称”。最终目标是在此数据框中添加另一列,显示'commercial\u name'的“清理”版本。我有一个单独的熊猫系列,其中包含应该使用的“正确”名称,而不是这些“混乱”的名称 real_model_names = pd.Series(['uno', '147', 'panda', 'punto', '166', '4c', 'brera', 'giulia', 'giulietta', 'gtv']
real_model_names = pd.Series(['uno', '147', 'panda', 'punto', '166', '4c', 'brera', 'giulia',
'giulietta', 'gtv'])
这些都是字符串。因此,作为一个例子,我想在'commercial\u name'的每一行查找它是否包含'real\u model\u names series'中的任何名称。例如,“真实车型名称”中的“punto”可在“商业车型名称”列中的“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
作为下一步,我将应用此函数并将其作为新列添加到dataframe:
commercial_name_cleaned = cars_em_df.commercial_name.apply(str_ops)
cars_em_df.insert(3,value=commercial_name_cleaned,column='commercial_name_cleaned')
然而,这没有任何作用。新列只显示与“商业名称”完全相同的条目
有人知道如何解决这个问题吗?有更好的方法吗
提前多谢 您的环路在正确的轨道上。我能想到的最具可读性和最直接的方法是:
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
你的环路在正确的轨道上。我能想到的最具可读性和最直接的方法是:
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