首页 > 解决方案 > 循环遍历相应的行并更改数据框的值

问题描述

我有这个包含大量数据的 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

我不知道问题是什么。如果你能帮我解决这个问题,那就太好了。

标签: pythonpandascsv

解决方案


我认为分别为每一列执行此操作。每次遇到 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

推荐阅读