Pandas如何将Final列中小于负变量v的值替换为v,其余保留原值
需求实现方案
已知参数m = 170000,经计算阈值v = -(m/100) = -1700,我们需要将DataFrame的Final列中所有小于-1700的值替换为-1700,其余值保留原值。
完整前置代码(数据构造)
import pandas as pd import numpy as np # 定义参数 m = 170000 v = -(m/100) # 如需v为整数类型,可修改为 v = -int(m/100),避免结果出现浮点数后缀 # 原始数据集 data_dict = {'01-09-2021': 631, '02-09-2021': -442, '08-09-2021': 6, '09-09-2021': 1528, '13-09-2021': 2042, '14-09-2021': 1098, '15-09-2021': -2092, '16-09-2021': -6718, '20-09-2021': -595, '22-09-2021': 268, '23-09-2021': -2464, '28-09-2021': 611, '29-09-2021': -1700, '30-09-2021': 4392} # 构造DataFrame,日期为索引,值列命名为Final df = pd.DataFrame.from_dict(data_dict, orient='index', columns=['Final'])
三种正确实现方式
方式1:使用numpy.where(通用条件判断写法)
之前使用失败大概率是没有赋值回原列、或者条件写反,正确写法如下:
df['Final'] = np.where(df['Final'] < v, v, df['Final'])
方式2:使用df.loc定位赋值
df.loc[df['Final'] < v, 'Final'] = v
方式3:使用pandas自带clip方法(阈值截断场景最简洁)
直接指定下限为v即可自动完成小于下限的值替换:
df['Final'] = df['Final'].clip(lower=v)
处理结果验证
处理后Final列中原本小于-1700的-2092、-6718、-2464三个值会被替换为-1700,其余值保持不变,最终输出如下:
| 日期 | Final |
|---|---|
| 01-09-2021 | 631 |
| 02-09-2021 | -442 |
| 08-09-2021 | 6 |
| 09-09-2021 | 1528 |
| 13-09-2021 | 2042 |
| 14-09-2021 | 1098 |
| 15-09-2021 | -1700 |
| 16-09-2021 | -1700 |
| 20-09-2021 | -595 |
| 22-09-2021 | 268 |
| 23-09-2021 | -1700 |
| 28-09-2021 | 611 |
| 29-09-2021 | -1700 |
| 30-09-2021 | 4392 |
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

