如何基于子集DataFrame的acc_id更新主DataFrame的account字段
根据子集DataFrame更新主DataFrame指定字段
示例数据
import pandas as pd data1 = [{'account': 'abc_test', 'value': 100, 'acc_id': '11'}, {'account': 'def_test', 'value': 50, 'acc_id': '12'}, {'account': 'ghi_badbad', 'value': 25, 'acc_id': '13'}, {'account': 'hso', 'value': 22, 'acc_id': '14'}, {'account': 'mko', 'value': 47.5, 'acc_id': '15'}] data2 = [{'account': 'ghi_badbad', 'value': 25, 'acc_id': '13'}, {'account': 'mko', 'value': 47.5, 'acc_id': '15'}] df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2)
需求:根据data2中的acc_id值,将data1对应行的account字段更新为'xxx',最终输出格式需和原df1结构一致。
方案1:直接筛选更新(最简洁高效)
利用isin()方法直接匹配acc_id,批量赋值即可,无需额外合并操作:
# 筛选df1中acc_id存在于df2的行,修改account字段 df1.loc[df1['acc_id'].isin(df2['acc_id']), 'account'] = 'xxx' print(df1)
输出结果:
account value acc_id 0 abc_test 100.0 11 1 def_test 50.0 12 2 xxx 25.0 13 3 hso 22.0 14 4 xxx 47.5 15
方案2:基于merge的优化处理
如果一定要用merge方法,处理后缀列后即可得到目标格式:
# 执行merge操作 dfx = pd.merge(df1, df2, indicator=True, how='outer', on='acc_id') # 更新匹配行的account字段 dfx.loc[dfx['_merge'] == 'both', 'account_x'] = 'xxx' # 保留需要的列并去掉后缀重命名 result = dfx[['account_x', 'value_x', 'acc_id']].rename( columns={'account_x': 'account', 'value_x': 'value'} ) print(result)
输出结果和方案1完全一致,适合需要保留merge中间状态的场景。
方案3:索引匹配更新
通过设置索引对齐,利用update()方法完成更新:
# 将df1的acc_id设为索引 df1.set_index('acc_id', inplace=True) # 构造包含需要更新值的Series,索引为df2的acc_id update_values = pd.Series('xxx', index=df2['acc_id']) # 更新account字段 df1['account'].update(update_values) # 重置索引恢复原结构 df1.reset_index(inplace=True) print(df1)
输出同样符合需求,适合后续有更多索引相关操作的场景。
内容的提问来源于stack exchange,提问作者Moody
相关产品推荐
相关产品推荐

