求助:匹配Line Item替换DataFrame中Creative Size列值
解决DataFrame按匹配项替换列值的问题
我来帮你搞定这个问题~你之前的代码没生效是有原因的,先给你分析下,再给你几个靠谱的实现方法:
为什么你的原代码不生效?
你写的这段代码:
rename_dict = df1.set_index('Line Item').to_dict()['Size'] db['Creative Size'] = db['Creative Size'].replace(rename_dict)
这里的replace是拿Creative Size列里的值去匹配字典的键,但你的Creative Size里是Unknown,而字典的键是BB、CC这些Line Item的值,两者完全不匹配,自然没法替换啦!
正确的实现方法
方法1:用map + fillna(最简洁)
这个方法直接通过Line Item匹配对应Size,没匹配到的保留原数值:
# 先把df1转换成Line Item到Size的映射字典 size_mapping = df1.set_index('Line Item')['Size'].to_dict() # 用Line Item去查字典,查不到的用原来的Creative Size填充 db['Creative Size'] = db['Line Item'].map(size_mapping).fillna(db['Creative Size'])
这样处理后,AA因为不在字典里,会保留原来的Size1;BB和CC能查到对应的值,就会替换成Size2和Size3,完全符合你的预期。
方法2:用merge合并后处理
如果需要更直观的操作,可以先合并两个DataFrame,再选择对应的值:
# 按Line Item左合并,保留db的所有行 merged_df = db.merge(df1, on='Line Item', how='left') # 优先用df1的Size值,没有的话保留原Creative Size db['Creative Size'] = merged_df['Size'].fillna(merged_df['Creative Size']) # 删掉合并后多余的Size列(可选) db = db.drop(columns=['Size'])
方法3:用loc条件赋值
如果你想精准定位需要替换的行,可以用条件筛选后直接赋值:
size_mapping = df1.set_index('Line Item')['Size'].to_dict() # 筛选出Line Item在df1里的行 mask = db['Line Item'].isin(df1['Line Item']) # 对这些行的Creative Size进行替换 db.loc[mask, 'Creative Size'] = db.loc[mask, 'Line Item'].map(size_mapping)
内容的提问来源于stack exchange,提问作者coelidonum
相关产品推荐
相关产品推荐

