Pandas实现DataFrame筛选行赋值为另一DataFrame列值的方法
问题原因
原代码赋值失败是因为pandas赋值时默认按索引匹配:df1筛选出的符合条件的行索引为[0,4],而df2的索引为[0,1],仅索引重叠的位置(df1索引0)能成功赋值,索引4无匹配值因此为NaN。
解决方法
方法1:按行顺序直接赋值(适合df2行顺序和df1筛选结果顺序一致的场景)
提取df2的value值数组,忽略索引直接按顺序赋值给筛选出的行:
mask = (df1.unit_name == 'a') & (df1.is_required == 'Yes') df1.loc[mask, 'value'] = df2['value'].values df1['value'] = df1['value'].fillna('-')
方法2:关联匹配赋值(更稳妥,不受行顺序影响)
通过公共关联键做左连接匹配,不会因为行顺序错乱导致赋值错误:
# 拆分df1的dummy_column生成关联用的匹配字段 df1[['dummy1', 'dummy2', 'msg_column']] = df1['dummy_column'].str.split(' ', expand=True) # 左关联匹配value字段 df1 = df1.merge(df2[['dummy1', 'dummy2', 'msg_column', 'value']], on=['dummy1', 'dummy2', 'msg_column'], how='left') # 填充空值并删除临时匹配字段 df1['value'] = df1['value'].fillna('-') df1 = df1.drop(columns=['dummy1', 'dummy2', 'msg_column'])
内容的提问来源于stack exchange,提问作者Suneha K S
相关产品推荐
相关产品推荐

