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

标签 python pandas dataframe row

这是我想要的输出:

enter image description here

我正在尝试计算列 df[Value]df[Value_Compensed]。但是,为此,我需要考虑行 df[Value_Compensed] 的先前值。就我的表格而言:

  • 第一行所有值都是0
  • 以下行:df[Remained] = 先前的 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

谢谢。

曼努埃尔.

最佳答案

您可以使用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

关于python - 如何在 pandas + python 中将值从一行传递到下一行,并使用它递归计算相同的后续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944027/

相关文章:

python -::在 Python 中输入字符串

python - 使用 Praw 按关键字搜索每个 subreddit

python - 启用 Universal Repos 时无法在 Dockerfile 中找到包 python3-pip

python - 如何设置 2 行成为数据帧中原本有标题的标题?

python - 使用 numpy 数组中的值从 DataFrame 创建 Pandas DataFrame 以访问数据帧索引

python - 正则表达式,前两个字符作为字母 Python

python - Ruby 类似于 Python 中的 DSL

Python:使用循环将行添加到现有数据框中

python - 在 Pandas 中创建一个带有标签的列来对 DataFrame 进行分区。

python - 如何使用字典执行分类,其中每个键都是标签,每个值都是数据帧?