首页 > 解决方案 > 计算百分比变化的循环逻辑

问题描述

我的数据框:

A   B   C    A_Q  B_Q     C_Q
27  40  41    2    1      etc
28  39  40    1    5    
30  28  29    3    6    
28  27  28    4    1    
15  10  11    5    4    
17  13  14    1    5    
16  60  17    8    10   
14  21  18    9    1    
20  34  23    10   2    
21  45  34    7    4    

我想用 _Q 后缀遍历每一列中的每一行,从 A_Q 开始并执行以下操作:

  1. 如果 row value = '1',获取 col 'A' 中的对应值
  2. 将该值分配给一个变量,称之为 x
  3. 继续循环 col A_Q
  4. 如果行值是 1,2,3,4,5,6,7,8 或 9,则忽略
  5. 如果值为 10,则在 col 'A' 中获取相应的值并将其分配给变量 y
  6. 计算 % 变化,称为 chg,在 y 和 x 之间:(y/x)-1)*100
  7. 将 chg 附加到数据框
  8. 按照上面的步骤 1-7 继续往下走,直到结束

然后对其他列 B_Q、C_Q 等执行相同操作

例如,在上面,出现的第一个“1”对应于 col A 中的 28。所以 x = 28。然后继续迭代,忽略值 1 到 9,直到你得到一个 10,它对应于 col A 中的 20 . 计算 % change = ((20/27)-1)*100 = -25.9% 并将其附加到新创建的 col A_S 中的 df 中。然后从该点开始以相同的步骤继续,直到到达文件末尾。最后,对其余列执行相同操作。

那么df看起来像:

A   B   C    A_Q  B_Q     C_Q    A_S        B_S         C_S etc
27  40  41    2    1      etc
28  39  40    1    5    
30  28  29    3    6    
28  27  28    4    1    
15  10  11    5    4    
17  13  14    1    5    
16  60  17    8    10                        50
14  21  18    9    1    
20  34  23    10   2             -25.9
21  45  34    7    4    

我想创建一个函数,然后做类似的事情,df ['_S'] = df.apply ( function, axis =1)但我坚持执行上述步骤 1-8。谢谢!

标签: pythonpandasnumpy

解决方案


您是否需要将结果附加为新列?您最终将得到几乎为空的列,其中只有一个数据值。您能否将所有结果附加到“_Q”列的底部?无论如何,这是我对完成您所要求的所有功能的尝试:

def func(col1, col2):
    l = []
    x = None
    for index in range(0, len(col1)):
        if x is None and col1[index] == 1:
            x = col2[index]
            l.append(0)
        elif not(x is None) and col1[index] == 10:
            y = col2[index]
            l.append(((float(y)/x)-1)*100)
            x = None
        else:
            l.append(0)
    return l

然后你将这个函数 A_Q 作为 col1 和 A 作为 col2 传递,它应该返回你想要的。对于传递函数,假设每个 A、B、C 列都有一个关联的 _Q 列,您可以执行以下操作:

q = [col for col in df.columns if '_Q' in col]
for col in q:
    df[col[:len(col) - 2] + '_S] = func(df[col], df[col[:len(col) - 2]

推荐阅读