pandas遍历行列按条件替换值:将10-100间数值除以10
解决方案
不要手写逐元素循环,用pandas内置的批量操作实现,自动跳过非数值列,逻辑简洁无索引错误:
import pandas as pd import numpy as np # 测试数据构造 time = ['11:50', '12:50', '13:50'] data_1 = {'time': time, 'n1': [1, 5, 80], 'n2': [2, 6 ,7], 'n3': [3, 70 ,6], 'n4': [40, 8, 500], } df1 = pd.DataFrame(data = data_1) # 核心处理逻辑 # 筛选所有数值类型列,自动排除time等非数值列 numeric_columns = df1.select_dtypes(include='number') # 定位10<值<100的位置,替换为原值除以10的结果 df1[numeric_columns.columns] = numeric_columns.mask( cond=(numeric_columns > 10) & (numeric_columns < 100), other=numeric_columns / 10 )
处理后得到的结果完全符合预期:
| time | n1 | n2 | n3 | n4 |
|---|---|---|---|---|
| 11:50 | 1 | 2 | 3 | 4 |
| 12:50 | 5 | 6 | 7 | 8 |
| 13:50 | 8 | 7 | 6 | 500 |
原循环写法的问题
给出的循环无法得到正确结果,核心问题有3个:
- 遍历逻辑错误:
for i in df实际遍历的是DataFrame的列名,代码中完全没有用到遍历得到的i,仅靠j、k两个手动自增的索引定位单元格,会出现严重的位置错位,数据量稍大还会触发索引越界报错 - 赋值方式不规范:用
df[j][k]这种链式索引赋值,本质是在DataFrame的临时副本上修改,改动不会同步到原数据,还会触发SettingWithCopyWarning - 缺少类型判断:循环没有跳过非数值列,一旦对time列的字符串值做大小比较,会直接触发类型错误
内容的提问来源于stack exchange,提问作者n3a5p7s9t1e3r
相关产品推荐
相关产品推荐

