如何在pandas + python中将值从一行传递到下一行并使用它递归计算相同的跟随值

时间:2019-05-01 23:47:59

标签: python pandas dataframe row

这是我想要的输出:

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

谢谢。

Manuel。

1 个答案:

答案 0 :(得分:0)

您可以使用apply创建自定义的操作。我制作了一个虚拟数据集,因为您没有提供初始数据框。

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