Skip to main content
 首页 » 编程设计

python之循环遍历相应的行并更改数据框的值

2025年05月04日19findumars

我有这个包含大量数据的 csv 文件。我已经将 csv 作为 python 中的数据框。我想将每一行与其对应的行进行比较,如果第一行的值为 1,第二行的值为 100,则程序应将 100 替换为 50。如果有 2 行包含 1 以上的 100,则 100 的值应更改为 25 ,如果 100 以上有 3 行包含 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