Цикл логики для расчета% изменения - PullRequest
0 голосов
/ 05 июля 2018

Мой фрейм данных:

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', возьмите соответствующее значение в столбце 'A'
  2. присвойте это значение переменной, назовите его x
  3. продолжайте цикл вниз по кольцу A_Q
  4. если значение строки равно 1,2,3,4,5,6,7,8 или 9, игнорировать
  5. если значение равно 10, то получить соответствующее значение в столбце 'A' и присвоить его переменной y
  6. рассчитать% изменения, назовите его chg, между y и x: (y / x) -1) * 100
  7. добавить chg к фрейму данных
  8. продолжайте идти вниз по колонке с шагами 1-7 выше до конца

Затем сделайте то же самое для других столбцов B_Q, C_Q и т. Д.

Так, например, в приведенном выше первом появившемся «1» соответствует 28 в столбце А. Итак, x = 28. Затем продолжайте итерацию, игнорируя значения от 1 до 9, пока не получите 10, что соответствует 20 в столбце A. Рассчитайте% изменений = ((20/27) -1) * 100 = -25,9% и добавьте это к df во вновь созданном столбце A_S. Затем продолжите с этого момента теми же шагами, пока не дойдете до конца файла. И, наконец, сделайте то же самое для остальных столбцов.

Итак, 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 голосов
/ 05 июля 2018

Вам нужно добавить результаты в новый столбец? В итоге вы получите почти пустые столбцы с одним значением данных. Не могли бы вы просто добавить все результаты внизу столбцов '_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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...