循环逻辑来计算%变化

问题描述 投票:0回答:1

我的数据帧:

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. 如果行值='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。谢谢!

python pandas numpy
1个回答
1
投票

您是否需要将结果作为新列追加?你最终会得到几乎只有一个数据值的空列。你能将所有结果附加在'_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]
© www.soinside.com 2019 - 2024. All rights reserved.