Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环逻辑以计算百分比更改_Python_Pandas_Numpy - Fatal编程技术网

Python 循环逻辑以计算百分比更改

Python 循环逻辑以计算百分比更改,python,pandas,numpy,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

我的数据帧:

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”,则获取列“A”中的对应值
  • 将该值赋给一个变量,称之为x
  • 继续沿着col A_Q循环
  • 如果行值为1、2、3、4、5、6、7、8或9,则忽略
  • 如果值为10,则获取列“A”中的相应值并将其分配给变量y
  • 计算变化百分比,称之为chg,在y和x之间:(y/x)-1)*100
  • 将chg附加到数据帧
  • 继续按照上面的步骤1-7向下走,直到结束
  • 然后对其他列B_Q、C_Q等执行相同的操作

    例如,在上面,出现的第一个“1”对应于A列中的28。因此x=28。然后继续迭代,忽略值1到9,直到得到10,对应于a列中的20。计算%change=((20/27)-1)*100=-25.9%,并将其附加到新创建的a列中的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[''u S']=df.apply(function,axis=1)
    的操作,但我仍然坚持执行上述步骤1-8。谢谢

    是否需要将结果附加为新列?您将得到几乎为空的列,其中只有一个数据值。你能把所有的结果都加在“_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]
    

    Thx JSol,我不介意附加结果。将列名重新传递给func,问题是我的df将有几十个这样的列,识别它们的唯一方法是使用_Q后缀。如何做?例如,A_Q是df中带有_Q后缀的第一个列。那么我们如何才能在A_Q中抓住_Q左边的内容,即col2值的“A”?请查看我所做的编辑。这样的事行吗?取决于列的格式,但如果它与示例完全相同,则类似于df.columns[:3]中的col,我的意思是我实际上更喜欢将结果作为新列附加,以便最终结果看起来像我文章末尾的数据帧。这样就更容易对所有数据进行目视检查。我遵循你所做的,轻推到第一个_Q列,但这不是理想的解决方案,我希望能够识别以_Q结尾的第一列,然后从那里识别相关的前一列,而不必查看数据帧,如果这有意义的话?你真的很接近!也许是那样的?它不会将追加结果作为一个新列进行修复,但这应该不会太难修复。我在这一行中遇到一个无效的语法错误:l.append(func(df[col],df[col[:len(col)-2])