如何将main_df中指定Product值替换为mapping_df对应Model值
数据替换需求
需要对main_df数据框进行修改:将其Product列中的列表值替换为mapping_df数据框中对应的Model列表值,但仅当该Product值存在于查找列表to_replace_values中时才执行替换。
例如:main_df索引0处的Product值会被替换为mapping_df中所有对应的Model值,前提是该Product值在to_replace_values中能找到。
示例数据
import pandas as pd # 原始数据框 main_df = pd.DataFrame(data = { 'Product': { 0: "['Passenger Cars']", 1: "['New Cars', 'Mercedes-Maybach']", 2: "['New Cars', 'Mercedes-Benz C-Class']", 3: "['New Cars', 'Mercedes-Benz C-Class', 'Mercedes-AMG CLA Coupe']" } }) # 需要替换的Product值列表 to_replace_values = [ 'Passenger Cars', 'Mercedes-Benz Vans', 'New Cars', 'New Vans', 'Mercedes-Maybach', 'Mercedes-Benz', 'Mercedes-AMG', 'EQ Technology' ] # 映射数据框 mapping_df = pd.DataFrame({ 'Product': { 0: 'New Cars', 1: 'New Cars', 2: 'Passenger Cars', 3: 'Passenger Cars', 4: 'Mercedes-Maybach', 5: 'Mercedes-Maybach' }, 'Model': { 0: 'Mercedes-Benz GLA', 1: 'Mercedes-Benz GLB', 2: 'Mercedes-Benz GLE', 3: 'Mercedes-Benz GLS', 4: 'Mercedes-Maybach GLS', 5: 'Mercedes-Maybach S-Class' }}) # 预期输出 expected_outputs = pd.DataFrame( data = { 'Product': { 0: "['Mercedes-Benz GLE', 'Mercedes-Benz GLS']", 1: "['Mercedes-Benz GLA', 'Mercedes-Benz GLB', 'Mercedes-Maybach GLS', 'Mercedes-Maybach S-Class']", 2: "['Mercedes-Benz GLA', 'Mercedes-Benz GLB', 'Mercedes-Benz C-Class']", 3: "['Mercedes-Benz GLA', 'Mercedes-Benz GLB', 'Mercedes-Benz C-Class', 'Mercedes-AMG CLA Coupe']" } })
解决方案代码
import ast # 1. 把main_df中字符串格式的列表转换为实际列表对象 main_df['Product'] = main_df['Product'].apply(ast.literal_eval) # 2. 构建Product到对应Model列表的映射字典 product_to_models = mapping_df.groupby('Product')['Model'].agg(list).to_dict() # 3. 定义替换逻辑函数 def process_product_list(product_list): processed = [] for item in product_list: # 仅当item在替换列表中且存在映射时,替换为对应的Model列表 if item in to_replace_values and item in product_to_models: processed.extend(product_to_models[item]) else: processed.append(item) return processed # 4. 应用替换并转换回字符串格式(匹配预期输出的格式) main_df['Product'] = main_df['Product'].apply(process_product_list).apply(str) # 验证结果是否符合预期 print(main_df.equals(expected_outputs)) # 输出True表示匹配
内容的提问来源于stack exchange,提问作者Ibrahim Ayoup
相关产品推荐
相关产品推荐

