我想在滚动的基础上进行简单的计算,但是当我试图用嵌套的for循环来解决这个问题时,会遇到严重的性能问题。我需要在非常大的数据上执行这种操作,但是必须使用标准的Python(包括Pandas)。值是浮点数,可以是负数,零或正数。
我有一个pd.DataFrame(df 1),它包含(由一些维度构成,我们称之为key 1和key 2)一个开始列,一个结束列和一些介于两者之间的操作列,这些操作列被用来根据开始列计算结束列。
基本上,简单的逻辑是:start + plus - minus = end,其中每行的结束值是下一行的开始值。
这需要通过两个键来完成,即分别用于AX、AY和BX。
df 2显示了期望的结果,但是如果这个任务是在更大的表上完成的,我不知道如何以一种有效的方式到达那里,而不会占用我的内存。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([["A", "X", 3,6,4,0], ["A", "X", 0,2,10,0], ["A", "X", 0,9,3,0], ["A", "Y", 8,3,1,0], ["A", "Y", 0,2,3,0], ["B", "X", 4,4,2,0], ["B", "X", 0,1,0,0]]),
columns=['key1', 'key2', 'start', 'plus', 'minus', 'end'])
>>> df1
key1 key2 start plus minus end
0 A X 3 6 4 0
1 A X 0 2 10 0
2 A X 0 9 3 0
3 A Y 8 3 1 0
4 A Y 0 2 3 0
5 B X 4 4 2 0
6 B X 0 1 0 0
df2 = pd.DataFrame(np.array([["A", "X", 3,6,4,5], ["A", "X", 5,2,10,-3], ["A", "X", -3,9,3,3], ["A", "Y", 8,3,1,10], ["A", "Y", 10,2,3,9], ["B", "X", 4,4,2,2], ["B", "X", 2,1,0,3]]),
columns=['key1', 'key2', 'start', 'plus', 'minus', 'end'])
>>> df2
key1 key2 start plus minus end
0 A X 3 6 4 5
1 A X 5 2 10 -3
2 A X -3 9 3 3
3 A Y 8 3 1 10
4 A Y 10 2 3 9
5 B X 4 4 2 2
6 B X 2 1 0 3
4条答案
按热度按时间voj3qocg1#
代码(+一些数学)
结果
说明
让我们使用以下公式计算每行的值
如果观察公式,就会发现一个明显的模式,即 * 结束值等于组的起始值加上“加号”行的累积和减去“减号”行的累积和 *
v6ylcynt2#
您可以为减去
plus
和minus
列创建helper Series,为两列创建每组的累积和,并为最后的end
列添加start
的第一个值,然后为start
列使用DataFrameGroupBy.shift
并将第一个值替换为Series.fillna
中的原始值:mrwjdhj33#
您可以使用
astype
、df.iterrows()
和for
循环的组合执行以下操作:执行后,
df
现在是:注意:您的
df2
有错误,按照您提供的逻辑,row 5
的start
条目应该是4
而不是0
。e4yzc0pl4#
由于
apply
方法是逐行工作的,因此可以如下使用,无需任何for循环:最后,更新后的df1等同于您的df2。