Dataframe рекурсивно вычисляет значения с условиями [сложная логика] - PullRequest
0 голосов
/ 29 мая 2020

Кажется, я не могу решить эту проблему самостоятельно, хотя я уже очень старался, поэтому я хотел бы получить вашу поддержку в этом вопросе. Заранее благодарен за вашу помощь.

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

day   a     
1     1000  
2     0     
3     0     
4     -1200 
5     0     
6     0     
7     -50   
8     0     
9     0     
10    0     
11    -150  

Выход:

day   a     b    c   d
1     1000  1000 100 100
2     0     1000 100 200
3     0     1000 100 300
4     -1200 100  10  10
5     0     100  10  20
6     0     100  10  30
7     -50   50   5   35
8     0     50   5   40
9     0     50   5   45
10    0     50   5   50
11    -100  -50  0   0 

Объяснение:

  • a - дневная сумма.
  • b - это накопленная сумма a, но с условием, описанным ниже.
  • c = b * 10%
  • d = накопленная сумма c

Проблема здесь в logi c для столбца B. В день, когда в столбце a стоит минус:

  • , если a + b (предыдущего дня) + d (предыдущего дня)> 0, тогда b = результат , d = c (предыдущий d уже был добавлен к b, поэтому удалите предыдущий d); например, строка day = 4

  • если a + b (предыдущего дня)> 0, то b = предыдущий b + a; d = предыдущий d + c; например, строка day = 7

  • если a + b (предыдущего дня) + d (предыдущего дня) <= 0, то c, d превратится в 0; например, line day = 11 </p>

Я застрял несколько дней, поэтому ваша помощь очень ценится! Если есть вопросы, дайте мне знать.

1 Ответ

0 голосов
/ 29 мая 2020

Это слишком сложно, чтобы достичь векторизованных методов. Так что IMHO, лучший способ - забыть Pandas и просто обрабатывать массивы. Поскольку в конце мы используем результаты для загрузки фрейма данных, я бы использовал массивы numpy вместо простых списков. Код может быть:

# prepare the numpy arrays for the existing column and the new ones
A = df['a'].to_numpy()
B = np.ndarray(A.shape)
C = np.ndarray(A.shape)
D = np.ndarray(A.shape)

# initialize initial values of b, c and d to 0
b = c = d = 0

# loop over A and compute b, c, and d according to the requirements
for i, a in enumerate(A):
    if a + b > 0:
        b += a
        c = b // 10
        d += c
    elif a + b + d > 0:
        b += a + d
        c = b // 10
        d = c
    else:
        b += a
        c = d = 0
    # feed the arrays
    B[i], C[i], D[i] = b, c, d

# add the new columns to the DataFrame
df['B'] = B
df['C'] = C
df['D'] = D

Он дает, как и ожидалось:

    day     a       B      C      D
0     1  1000  1000.0  100.0  100.0
1     2     0  1000.0  100.0  200.0
2     3     0  1000.0  100.0  300.0
3     4 -1200   100.0   10.0   10.0
4     5     0   100.0   10.0   20.0
5     6     0   100.0   10.0   30.0
6     7   -50    50.0    5.0   35.0
7     8     0    50.0    5.0   40.0
8     9     0    50.0    5.0   45.0
9    10     0    50.0    5.0   50.0
10   11  -100   -50.0    0.0    0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...