不同列访问方式下两列相乘结果存在差异问题咨询
问题分析与解决:DataFrame相乘返回全NaN的原因
我来帮你捋清楚这个问题的核心——其实是pandas里Series和DataFrame的结构差异,以及DataFrame运算时的对齐规则在搞鬼。
先明确两种取数方式的本质区别
在pandas里,取列的两种写法对应完全不同的数据结构:
dataSet['BirthRate']:取出的是Series(一维序列,只有行索引,没有列名)dataSet[['BirthRate']]:取出的是DataFrame(二维表格,既有行索引,还有列名BirthRate)
为什么result1/result2正常,result3全NaN?
假设你的result1是用两个Series相乘(比如dataSet['BirthRate'] * dataSet['InternetUsers']),这时候pandas会直接按行索引对齐元素,对应位置直接相乘,结果自然正常。
但当你用两个单列DataFrame相乘时:dataSet[['BirthRate']] * dataSet[['InternetUsers']],pandas对DataFrame的运算规则是同时匹配行索引和列名。因为这两个DataFrame的列名分别是BirthRate和InternetUsers,没有任何重叠的列名,所有位置都无法找到匹配的元素,最终就返回了全NaN的DataFrame。
解决办法(三种可选)
1. 最推荐:直接用Series相乘(简单直观)
放弃双括号写法,直接取Series做运算:
result_fix = dataSet['BirthRate'] * dataSet['InternetUsers']
2. 将DataFrame转为Series后相乘
如果一定要用双括号取数,可以用squeeze()把单列DataFrame转成Series:
result_fix = dataSet[['BirthRate']].squeeze() * dataSet[['InternetUsers']].squeeze()
3. 用mul()方法跳过列名匹配
使用DataFrame的乘法方法,指定按行索引对齐,直接用值数组运算:
result_fix = dataSet[['BirthRate']].mul(dataSet[['InternetUsers']].values, axis=0)
示例验证
我模拟了你的数据集前5行,运行代码可以直观看到差异:
import pandas as pd # 模拟你的数据集 dataSet = pd.DataFrame({ 'BirthRate': [15.2, 18.5, 12.1, 9.8, 22.3], 'InternetUsers': [65.4, 42.1, 78.9, 89.2, 31.5] }) # 正常的Series相乘 result1 = dataSet['BirthRate'] * dataSet['InternetUsers'] print("Result1(Series相乘):") print(result1) # 双括号DataFrame相乘,返回全NaN result3 = dataSet[['BirthRate']] * dataSet[['InternetUsers']] print("\nResult3(DataFrame相乘):") print(result3) # 修复后的结果 result_fix = dataSet['BirthRate'] * dataSet['InternetUsers'] print("\n修复后的结果:") print(result_fix)
运行后你会看到result3全是NaN,而其他结果完全正常。
内容的提问来源于stack exchange,提问作者Kevin Stephen Biswas
相关产品推荐
相关产品推荐

