Как передать значение из одной строки в следующую в pandas + python и использовать его для рекурсивного вычисления того же значения - PullRequest
1 голос
/ 02 мая 2019

Это мой желаемый вывод:

enter image description here

Я пытаюсь вычислить столбец df[Value] и df[Value_Compensed]. Однако для этого мне нужно рассмотреть предыдущее значение строки df[Value_Compensed]. С точки зрения моей таблицы:

  • В первой строке все значения 0
  • Следующие строки: df[Remained] = previous df[Value_compensed]. Тогда df[Value] = df[Initial_value] + df[Remained]. Тогда df[Value_Compensed] = df[Value] - df[Compensation]

... и так далее ...

Я изо всех сил пытаюсь передать значение Value_Compensed из одной строки в другую, я пытался с помощью функции shift (), но, как вы можете видеть на следующем рисунке, значения в df[Value_Compensed] не верны, потому что это не так статическое значение, а также оно меняется после того, как каждая строка не работает. Любая идея ??

enter image description here

Спасибо.

Мануэль.

1 Ответ

0 голосов
/ 05 мая 2019

Вы можете использовать применить для создания ваших пользовательских операций.Я сделал фиктивный набор данных, так как вы не указали исходный кадр данных.

from itertools import zip_longest

# dummy data
df = pd.DataFrame(np.random.randint(1, 10, (8, 5)),
                  columns=['compensation', 'initial_value',
                           'remained', 'value', 'value_compensed'],)
df.loc[0] = 0,0,0,0,0

>>> print(df)
   compensation  initial_value  remained  value  value_compensed
0             0              0         0      0                0
1             2              9         1      9                7
2             1              4         9      8                3
3             3              4         5      7                6
4             3              2         5      5                6
5             9              1         5      2                4
6             4              5         9      8                2
7             1              6         9      6                8

Используйте apply (axis=1) для построчной итерации, где вы используете исходный кадр данных в качестве аргумента,из которого вы можете затем получить предыдущую строку x.name-1 и выполнить ваши вычисления.Не уверен, что я полностью понял предполагаемый результат, но вы можете настроить отдельные вычисления для различных столбцов в функции.

def f(x, data):
    if x.name == 0:
        return [0,]*data.shape[1]
    else:
        x_remained = data.loc[x.name-1]['value_compensed']
        x_value = data.loc[x.name-1]['initial_value'] + x_remained
        x_compensed = x_value - x['compensation']

        return [x['compensation'], x['initial_value'], x_remained, \
               x_value, x_compensed]

adj = df.apply(f, args=(df,), axis=1)
adj = pd.DataFrame.from_records(zip_longest(*adj.values), index=df.columns).T

>>> print(adj)
   compensation  initial_value  remained  value  value_compensed
0             0              0         0      0                0
1             5              9         0      0               -5
2             5              7         4     13                8
3             7              9         1      8                1
4             6              6         5     14                8
5             4              9         6     12                8
6             2              4         2     11                9
7             9              2         6     10                1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...