循环逻辑计算变化百分比

时间:2018-07-05 19:28:04

标签: python pandas numpy

我的数据框:

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. 保持循环查看A_Q栏
  4. 如果行值是1,2,3,4,5,6,7,8或9,则忽略
  5. 如果该值为10,则在col'A'中获取相应的值,并将其分配给变量y
  6. 计算y和x之间的变化百分比,将其称为chg:(y / x)-1)* 100
  7. 将chg附加到数据框
  8. 通过上面的步骤1-7继续沿列向下进行,直到结束

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

因此,例如,在上文中,第一个出现的“ 1”对应于col A中的28。因此x =28。然后继续进行迭代,忽略值1到9,直到得到10(对应于20)在col A中计算百分比变化=(((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。谢谢!

1 个答案:

答案 0 :(得分: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]