我希望构建一个函数,为以下数据帧按代码逐日创建滚动总计,其中某一日期的每个代码的输入从某一日期的每个代码的输出中减去,此小计是从前几天的总计中减去的,但总计必须为>=0(我在下面的所需输出中包含了一个示例)
下面是我的输入和使用的函数的示例,以及我所需输出的示例
df1-In
s = """ Date Code Quantity
0 10/01/2019 A 20
3 11/01/2019 A 2
7 12/01/2019 A 4
11 13/01/2019 A 10
"""
df2-输出
s =''' Date Code Quantity
0 11/01/2019 A 5
3 12/01/2019 A 100
4 15/01/2019 A 1
6 16/01/2019 A 2
'''
代码
df3 = df1.merge(df2, how='outer', left_on=['date', 'code'], right_on=['date', 'code']).fillna(0)
df3['qty1'] = df3['qty_x'] - df3['qty_y']
df3['qty'] = 0
def final_adder(x):
x.qty_x = x.qty_x
print(x)
return x
df_final = df3.groupby(['code']).apply(final_adder)
df_final['qty'] = df_final['qty'].clip(lower=0)
df_final.drop(['qty_x', 'qty_y','qty1'], inplace=True, axis=1)
date code qty_x qty_y qty1 qty
0 10/01/2019 A 20.0 0.0 20.0 0
3 11/01/2019 A 2.0 5.0 -3.0 0
7 12/01/2019 A 4.0 100.0 -96.0 0
11 13/01/2019 A 10.0 0.0 10.0 0
所需输出
s = """ Date Code Quantity
0 10/01/2019 A 20
3 11/01/2019 A 17
7 12/01/2019 A 0
11 13/01/2019 A 10
12 14/01/2019 A 10
15 15/01/2019 A 9
16 16/01/2019 A 7
"""
关于SO的问题有一个完整的子类型,涉及带限制的累积运算(例如:“当累积和变为负数时重置为零”)。这与具有已知重置点的累积操作(例如,来自另一列或存在NaN等)不同,因为该条件涉及累积值本身
在当前的熊猫或numpy中,没有干净的方法以矢量化的方式实现这一点
我所知道的最好(最快)的方法是this SO answer涉及
numba
。根据您的问题稍作修改和调整:使用此功能,您可以执行以下操作:
关于问题中提供的数据:
如果愿意,还可以使用“合并”。以下是保存所有中间结果的示例(用于法医分析):
相关问题 更多 >
编程相关推荐