Pandas筛选含BPS的列计算后回写原数据集的实现方法
问题描述
现有大型Pandas DataFrame,需完成如下处理:
- 筛选出列名包含特定短语(如
BPS)的列 - 对筛选出的列内所有数值统一除以10000
- 将计算结果替换回原数据集对应列,其余列保持不变
目前可通过代码筛选出目标列,但无法将处理结果正确回写到原数据集。之前尝试的代码如下:
raw = raw.filter(like = 'BPS', axis = 1) / 10000
上述写法只会返回处理后的目标列,原数据中其他列会被丢弃,不符合需求。希望找到最简洁清晰的实现方式,尽量避免冗余的自定义函数。
解决方案
直接通过列定位批量赋值即可,一行代码就能完成全流程,对大型数据集也很友好:
# 匹配所有列名包含'BPS'的列(忽略大小写),原地完成除法计算和回写 raw.loc[:, raw.columns.str.contains('BPS', case=False)] /= 10000
如果需要严格匹配大小写,删除参数case=False即可。
写法说明
raw.columns.str.contains('BPS')会生成对应列的布尔选择掩码,比filter方法更适配批量赋值的场景loc[:, 列选择掩码]会精准定位所有目标列的位置,配合/=原地计算符直接更新对应列的值,不会改动非目标列的任何数据,也不会生成多余的DataFrame副本,内存开销更低- 逻辑直白,不需要额外写自定义函数,也不需要做拆分、拼接DataFrame的操作,后续如果要调整匹配规则(比如换正则匹配、改匹配关键词)也很方便
如果更习惯用
filter的匹配逻辑,也可以用下面的等价写法:raw[raw.filter(like='BPS').columns] /= 10000只是从灵活性角度看,
str.contains的方案适配场景更广。
内容的提问来源于stack exchange,提问作者BPD
相关产品推荐
相关产品推荐

