python - 循环遍历相应的行并更改数据框的值
问题描述
我有这个包含大量数据的 csv 文件。我已将 csv 作为 python 中的数据框。我想将每一行与其对应的行进行比较,如果第一行的值为 1 ,第二行的值为 100 ,则程序应将 100 替换为 50。如果有 2 行包含 1 高于 100 ,则 100 的值应该改为 25 ,如果有 3 行在 100 以上包含 1 ,那么 100 的值应该是 12.5 等等。这是 csv 文件的数据框:
rule_id 51594 51668 51147 51182 51447
0 comparison1 1.0 1.0 NaN NaN NaN
1 last_comp 100.0 100.0 NaN NaN NaN
2 comparison1 NaN NaN 1.0 NaN 1.0
3 comparison2 100.0 NaN 1.0 NaN 1.0
4 comparison3 NaN NaN 1.0 100.0 100.0
5 comparison4 NaN NaN 100.0 NaN NaN
结果应如下所示:
rule_id 51594 51668 51147 51182 51447
0 comparison1 1.0 1.0 NaN NaN NaN
1 last_comp 50.0 50.0 NaN NaN NaN
2 comparison1 NaN NaN 1.0 NaN 1.0
3 comparison2 100 NaN 1.0 NaN 1.0
4 comparison3 NaN NaN 1.0 100 25.0
5 comparison4 NaN NaN 12.5 NaN NaN
这是代码:
for key in df:
for i, value in enumerate(df[key]):
n = 1
t = 100
if value == t and i > 0 and df[key][i-n] == 1.0:
df[key][i] = value/2
n = n+1
t = t/2
break
基本上我在这里所做的是我声明了 2 个变量。 n 的值为 1 和 t 的值为 100,然后在 if 循环中使用它们。
我得到的结果是:
rule_id 51594 51668 51147 51182 51447
0 comparison1 1.0 1.0 NaN NaN NaN
1 last_comp 50.0 50.0 NaN NaN NaN
2 comparison1 NaN NaN 1.0 NaN 1.0
3 comparison2 100.0 NaN 1.0 NaN 1.0
4 comparison3 NaN NaN 1.0 100.0 50.0
5 comparison4 NaN NaN 50.0 NaN NaN
我不知道问题是什么。如果你能帮我解决这个问题,那就太好了。
解决方案
我认为分别为每一列执行此操作。每次遇到 100 时需要为每列组成组。
import pandas as pd
for col in df.columns[1:]:
df[col] = (df[col].groupby(df[col].eq(100).shift(1).fillna(0).cumsum())
.apply(lambda x: x.mask(x == 100, 100/(2**x.eq(1).sum()))))
输出:
rule_id 51594 51668 51147 51182 51447
0 comparison1 1.0 1.0 NaN NaN NaN
1 last_comp 50.0 50.0 NaN NaN NaN
2 comparison1 NaN NaN 1.0 NaN 1.0
3 comparison2 100.0 NaN 1.0 NaN 1.0
4 comparison3 NaN NaN 1.0 100.0 25.0
5 comparison4 NaN NaN 12.5 NaN NaN
推荐阅读
- javascript - 如何使 Snackbar 在类组件中工作?
- selenium - 使用 XPath 查找兄弟
- npm - 发布 NPM 包的问题(org.couchdb.user:USERNAME' 不在 npm 注册表中)
- excel - 有什么方法可以读取 .net core 3.1 中的 .xlsx 扩展文件?
- python - 以与当前时间戳相当的方式从 UTC 格式的字符串中解析时间
- apache-spark - 从 ORC 到 hive 列的自定义列映射
- text-processing - 如何确定文件/文件夹是否具有升序编号模式?
- matlab - 在 Matlab 中使用 fminsearch 时如何解决局部最小值问题?
- node.js - NodeJs上传csv字符串内容到s3
- android - 询问有关 Android VTS 的问题