同列名DataFrame对比及透视表返回空值问题咨询
问题分析与解决方案
为什么会得到空透视表?
大概率是以下几个原因导致:
mergeDimensions或mergeMeasures的列名与合并后的diffDf列名不匹配(比如大小写、空格差异,或者列名拼写错误)- df2的数值列没有正确被乘以-1(比如操作了视图而非原数据,或者列选择错误)
- 透视表默认丢弃了全空的行/列,导致无输出结果
更优实现方式
方式一:直接合并后计算差异(推荐)
这种方式能同时保留两个DataFrame的原始数据和计算出的差异,对比更直观:
# 可选:给两个DataFrame添加来源标识,方便数据追溯 df1['数据来源'] = 'df1' df2['数据来源'] = 'df2' # 按维度列外连接,保留所有维度组合 merged_df = pd.merge(df1, df2, on=mergeDimensions, suffixes=('_df1', '_df2'), how='outer') # 遍历数值列,计算差异(空值用0填充) for col in mergeMeasures: merged_df[f'{col}_差值'] = merged_df[f'{col}_df1'].fillna(0) - merged_df[f'{col}_df2'].fillna(0)
方式二:修正concat+透视表的实现
如果坚持用聚合求和的方式展示差异,修正后的代码如下:
# 复制df2并将数值列取反,避免修改原数据 df2_neg = df2.copy() df2_neg[mergeMeasures] = df2_neg[mergeMeasures] * -1 # 合并时重置索引,避免索引冲突 diffDf = pd.concat([df1, df2_neg], ignore_index=True) # 生成透视表,设置dropna=False保留所有维度组合 datFraPiv = diffDf.pivot_table( index=mergeDimensions, values=mergeMeasures, aggfunc='sum', dropna=False )
内容的提问来源于stack exchange,提问作者Ddude
相关产品推荐
相关产品推荐

