基于Pandas实现DataFrame对比与数据更新合并的解决方案咨询
解决方案:更新版本计数的Pandas实现
当然有完美的解决方案!我来给你一步步拆解怎么实现这个需求:
核心思路
我们可以把新数据先统一加上初始计数1,再和原有汇总数据合并,最后按版本分组求和——这样既可以自动处理“已有版本计数+1”,又能把新出现的版本以计数1加入汇总。
简洁版代码实现
import pandas as pd # 初始化原始数据 datanew = [{"version": "Adobe 1.0.2"}, {"version": "Microsoft 1.3.27"}, {"version": "Test 0.0.2"}] datasum = [{"version": "Adobe 1.0.2","number" : 1}, {"version": "Microsoft 1.3.27", "number" : 2}] # 转换为Pandas DataFrame df_new = pd.DataFrame(datanew) df_sum = pd.DataFrame(datasum) # 给新数据添加计数列,所有新版本初始计数为1 df_new['number'] = 1 # 合并两个数据集,按版本分组求和 combined_df = pd.concat([df_sum, df_new]).groupby('version', as_index=False)['number'].sum() # 转换回你需要的字典列表格式 datasum_updated = combined_df.to_dict('records') # 输出结果 print(datasum_updated)
代码解释
pd.concat([df_sum, df_new]):把原有汇总数据和带初始计数的新数据合并成一个大的数据集,所有版本记录都被包含进来groupby('version', as_index=False)['number'].sum():按version列分组,自动把相同版本的计数相加——正好对应“已有版本计数+1”的需求;新出现的版本因为只有初始的1,求和后就是1to_dict('records'):把处理后的DataFrame转换回你需要的字典列表格式,和原始数据结构完全一致
运行这段代码后,你会得到期望的结果:
[{"version": "Adobe 1.0.2","number": 2}, {"version": "Microsoft 1.3.27", "number": 3}, {"version": "Test 0.0.2","number": 1}]
另一种实现方式(合并匹配法)
如果你更倾向于用匹配的方式处理,也可以用外连接的方法:
import pandas as pd datanew = [{"version": "Adobe 1.0.2"}, {"version": "Microsoft 1.3.27"}, {"version": "Test 0.0.2"}] datasum = [{"version": "Adobe 1.0.2","number" : 1}, {"version": "Microsoft 1.3.27", "number" : 2}] df_new = pd.DataFrame(datanew) df_sum = pd.DataFrame(datasum) df_new['number'] = 1 # 外连接两个数据集,匹配相同版本 merged = df_sum.merge(df_new, on='version', how='outer', suffixes=('_sum', '_new')) # 处理空值,把原有计数和新计数相加,空值用0填充 merged['number'] = merged['number_sum'].fillna(0) + merged['number_new'].fillna(0) # 保留需要的列并转换计数为整数 merged = merged[['version', 'number']].astype({'number': int}) datasum_updated = merged.to_dict('records')
这个方法的逻辑是先匹配相同版本,再把对应计数相加,结果和简洁版完全一致,适合喜欢分步处理的场景。
内容的提问来源于stack exchange,提问作者enim horsti
相关产品推荐
相关产品推荐

