pandas DataFrame.get()传入存在列列表返回None问题排查
问题现象
- 已完成加载的pandas DataFrame
merged执行merged.info()可正常输出结构元信息,全字段无空值 - 运行环境为Google Colab,使用pandas版本为1.3.5
- 执行代码
print(merged.get(['PM2.5_CF1_ug/m3', 'Uptime Minutes', 'RSSI_dbm', 'Temperature_F', 'Humidity_%']))时,未返回目标列对应数值,直接返回None(NoneType类型结果) - 问题在未修改任何代码的情况下突发出现,重新完整加载DataFrame后问题未解决
根因说明
pandas 1.3.5版本中DataFrame.get()方法**仅支持传入单个列名(标量值)**作为查询参数,不支持传入列名列表选取多列。
该方法的判断逻辑为:先校验传入的key是否存在于列名中,若不存在则返回默认值
None。当传入列表类型的多列名时,列表本身不会被识别为合法列名,因此直接走到默认返回分支输出None,和DataFrame本身的数据完整性、加载状态无关。多列列表传入的支持是pandas 2.0及以上版本才新增的特性。
可行解决方案
- 通用写法(兼容所有pandas版本,推荐优先使用):直接使用pandas原生方括号索引做多列选取,替换原有
.get()调用即可
# 替换原有merged.get(列列表)的写法 target_cols = ['PM2.5_CF1_ug/m3', 'Uptime Minutes', 'RSSI_dbm', 'Temperature_F', 'Humidity_%'] print(merged[target_cols])
- 保留容错能力的写法:如果需要实现
.get()「列不存在时不报错、返回默认值」的特性,可先校验列存在性再做选取
target_cols = ['PM2.5_CF1_ug/m3', 'Uptime Minutes', 'RSSI_dbm', 'Temperature_F', 'Humidity_%'] exist_cols = [col for col in target_cols if col in merged.columns] # 存在匹配列则返回对应数据,否则返回None,和get的容错逻辑一致 print(merged[exist_cols] if exist_cols else None)
- 版本升级方案:在Colab中执行以下命令升级pandas到2.0+版本,重启运行时后即可直接使用
.get()传入列名列表的写法
!pip install pandas --upgrade
内容的提问来源于stack exchange,提问作者Senthil Vikram Vodapalli
相关产品推荐
相关产品推荐

