pandas - Pandas Dataframe 根据算术距离有条件地更改值
问题描述
我有一个在“a”列中权重的熊猫数据框。我只想在权重变化超过 0.05(在两个方向上)并保存结果列“a_1”时才更改权重。是否可以在不使用循环的情况下做到这一点?
date a a_1
2017-06-30 0.72 0.72
2017-07-01 0.74 0.72
2017-07-02 0.71 0.72
2017-07-03 0.70 0.72
2017-07-04 0.67 0.72
2017-07-05 0.66 0.66 --> difference is -0.06 < -0.05
2017-07-06 0.65 0.66
2017-07-07 0.76 0.76 --> difference is +0.10 > +0.05
2017-07-08 0.77 0.76
2017-07-09 0.78 0.76
2017-07-10 0.74 0.76
2017-07-11 0.69 0.70 --> difference is -0.07 < -0.05
2017-07-12 0.73 0.70
2017-07-13 0.73 0.70
解决方案
你可以使用 Pandas 的apply
方法,这对你来说比 for 循环更可取吗?
不幸的是,这将意味着更改函数内部的全局变量。如果你能忍受,以下工作:
number_to_compare = 0
def get_weight(row):
global number_to_compare
if abs(row.a - number_to_compare) > 0.05:
number_to_compare = row.a
return row.a
return number_to_compare
df['a_1'] = df.apply(get_weight, axis=1)
输出:
a a_1
date
2017-06-30 0.72 0.72
2017-07-01 0.74 0.72
2017-07-02 0.71 0.72
2017-07-03 0.70 0.72
2017-07-04 0.67 0.72
2017-07-05 0.66 0.66
2017-07-06 0.65 0.66
2017-07-07 0.76 0.76
2017-07-08 0.77 0.76
2017-07-09 0.78 0.76
2017-07-10 0.74 0.76
2017-07-11 0.69 0.69
2017-07-12 0.73 0.69
2017-07-13 0.73 0.69
推荐阅读
- c# - 嵌套的 3 级 LINQ 查询
- elasticsearch - 使用 logstash 对弹性搜索字段进行排序
- go - Sarama 无法为 Amazon MSK 版本 2.3.1 生成消息
- boolean-logic - 简化布尔表达式:X + X'Y'Z
- amazon-web-services - Lambda@Edge 中的 DynamoDB 访问
- javascript - JS 脚本可以阻塞整个服务器吗?如果是这样,我怎么可能摆脱这种攻击?
- sql - SQL 中基于所选选项的条件 Where 子句
- docker - Docker 中的配置 Nanoc 错误面临“Nanoc::Core::ConfigLoader::NoConfigFileFoundError:未找到配置文件”
- python - KML 将数据扩展到叶标记弹出窗口
- docker - 如何使用 --ulimit 选项在 docker 容器中将 POSIX 消息队列限制设置为无限制