同维度DataFrame相除后维度异常且全为NaN问题求助
问题分析与解决方案
核心原因
你遇到的问题本质是两个DataFrame的索引/列标签未正确对齐,导致divide执行了外连接(outer join),没有匹配的元素,最终生成全NaN的结果。当你直接用values计算时,是按数组位置强制相除,跳过了pandas的标签对齐逻辑,所以能得到正确结果,但丢失了索引和列的语义信息。
解决方案
方法1:修正导入流程,确保索引与列完全匹配
你的示例数据是分层表头结构,原导入代码错误地将表头行当作数据索引,导致索引和列的标签混乱。正确的导入方式如下,保证两个DataFrame的索引(年份)和列MultiIndex(州+地区)完全一致:
import pandas as pd # 处理 household_income_sample.csv household_income = pd.read_csv( 'household_income_sample.csv', header=[0, 1, 2], # 指定前3行为分层表头 index_col=2 # 将第3层表头(Year)作为数据索引 ) # 移除列MultiIndex中空的Year层级 household_income.columns = household_income.columns.droplevel(2) # 清理索引,只保留年份作为索引 household_income = household_income.reset_index(level=[0,1], drop=True) # 转换数据类型为数值型 household_income = household_income.astype(float) # 处理 housing_prices_sample.csv(逻辑完全一致) housing_prices = pd.read_csv( 'housing_prices_sample.csv', header=[0, 1, 2], index_col=2 ) housing_prices.columns = housing_prices.columns.droplevel(2) housing_prices = housing_prices.reset_index(level=[0,1], drop=True) housing_prices = housing_prices.astype(float) # 此时执行除法会自动按标签对齐计算 blah = housing_prices.divide(household_income)
方法2:强制按位置匹配计算(不推荐,仅应急使用)
如果无法修正索引/列结构,可强制跳过标签对齐,直接按位置计算:
# 方式1:用divide的参数指定按行位置匹配 blah = housing_prices.divide(household_income.values, axis=0) # 方式2:转换为数组计算后再转回DataFrame,保留原索引和列 blah = pd.DataFrame( housing_prices.values / household_income.values, index=housing_prices.index, columns=housing_prices.columns )
对提问方式的反馈
- 优点:提供了示例数据和完整导入代码,能快速复现问题,这是非常好的提问习惯;清晰描述了现象、尝试过的方法和期望结果。
- 优化点:可以补充两个DataFrame的索引/列的具体输出(比如
print(housing_prices.index)和print(housing_prices.columns)的结果),能更快定位到标签对齐的问题;明确说明期望按「年份+州」的对应关系计算,语义更清晰。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

