如何在Python中生成显示两个DataFrame行级数值差异的新DataFrame?
计算两个DataFrame指定列的数值差异
假设你的两个DataFrame分别叫df_old(旧数据集)和df_new(新数据集),要对比的列是Quantity、Price、Local Value、Local Exposure,下面分两种场景给你具体操作:
场景1:两行数据完全对齐(索引/行顺序一致)
如果两个DataFrame的每一行是一一对应的(比如按相同顺序排列,或者索引完全匹配),直接对指定列做减法就行,步骤如下:
import pandas as pd # 定义需要对比的列名 cols_to_compare = ['Quantity', 'Price', 'Local Value', 'Local Exposure'] # 计算新数据减旧数据的差异(想算旧减新就反过来) df_diff = df_new[cols_to_compare] - df_old[cols_to_compare] # 给列名加上后缀,明确是差异值 df_diff.columns = [f'{col}_diff' for col in cols_to_compare]
运行后df_diff就是只包含各列数值差异的新DataFrame,正数代表新数据比旧数据大,负数则相反。
场景2:行顺序不一致,但有共同标识列
如果两个DataFrame的行排序不一样,但有共同的唯一标识列(比如商品ID、名称这类),就得先合并再计算差异:
import pandas as pd # 假设共同的标识列是'Product ID'(换成你实际的列名) merge_key = 'Product ID' cols_to_compare = ['Quantity', 'Price', 'Local Value', 'Local Exposure'] # 合并两个数据集,只保留标识列和需要对比的列 merged_df = pd.merge( df_old[[merge_key] + cols_to_compare], df_new[[merge_key] + cols_to_compare], on=merge_key, suffixes=('_old', '_new') # 给新旧数据的列加后缀区分 ) # 逐个计算每列的差异 for col in cols_to_compare: merged_df[f'{col}_diff'] = merged_df[f'{col}_new'] - merged_df[f'{col}_old'] # 提取标识列和所有差异列,得到最终的差异DataFrame df_diff = merged_df[[merge_key] + [f'{col}_diff' for col in cols_to_compare]]
额外提醒
- 如果某个行只在其中一个DataFrame里存在,合并时可以把
how='outer'加到pd.merge()参数里,这样会保留所有行,差异列会显示NaN,需要的话可以用df_diff.fillna(0)把缺失值换成0。 - 确保要对比的列都是数值类型,如果是字符串格式的数字,得先转成数值(比如用
pd.to_numeric())。
内容的提问来源于stack exchange,提问作者user21476558
相关产品推荐
相关产品推荐

