python - 有没有办法优化熊猫中的 itterrows 代码?
问题描述
这是输入数据
期末库存值仅通过添加期初库存、购买数量和已售数量来计算期初库存值。
我想在有条件的情况下为“期初股票”和“期末股票”添加值。
- 当期初股票值为0或为空时,应填写上一次记录的期末股票
- 仅当此记录和先前记录的站点和项目代码相同时才应进行填充
对于 i,df.iterrows() 中的行:
df['Opening Stock'] = np.where((df['Site'] == df['Site'].shift(1)) & (df['Item Code'] == df['Item Code'].shift(1))& ((df['Opening Stock'] == 0) | (df['Opening Stock'].isna())),df['Closing Stock'].shift(1),df['Opening Stock'])
df['Closing Stock'][i] = df['Opening Stock'][i]+df['Purchase Qty'][i]+df['Sold Qty'][i]
这就是输出的样子
问题是由于数据集的大小很大,因此需要数小时才能完成。
有没有办法优化这段代码?
解决方案
您可以在没有任何迭代方法的情况下做到这一点。第一步是将0
值转换为Opening Stock
,np.nan
以便我们可以在下一步中填充它们。
import pandas as pd
import numpy as np
df = pd.DataFrame({'Site': ['site 1', 'site 1', 'site 2', 'site 2'],
'Item Code': ['A', 'A', 'A', 'A'],
'Opening Stock': [1000, 0, 2000, 0],
'Closing Stock': [1200, 0, 2250, 0],
'Purchase Qty': [500, 100, 400, 300],
'Sold Qty': [-300, -200, -150, -100]})
df.loc[df['Opening Stock'] == 0, 'Opening Stock'] = np.nan
df['Opening Stock'] = df.groupby(['Site', 'Item Code'])['Opening Stock'].fillna(df['Closing Stock'].shift(1))
df['Closing Stock'] = df['Opening Stock'] + df['Purchase Qty'] + df['Sold Qty']
推荐阅读
- oauth-2.0 - 如何设置范围以在 Java 中调用 Google People API?
- java - 我怎样才能摆脱以下突出显示的输出?
- flutter - webview_flutter 违反了内容安全政策,有什么解决办法吗?
- r - 如何使用 R 中 patchwork 包中的 inset_element() 函数嵌入地图
- webhooks - 通过 webhook 连接器更新 Teams 中的消息卡
- android - 使用改造 HttpException 捕获错误消息
- typescript - 可以使用数组值来创建具有相应字符串文字的键值类型吗?
- spring-boot - Spring Boot + grpc 日志记录 + 相关 ID?
- kotlin - 如何使用阻塞代码取消协程
- python - 用日期时间数据绘制 scipy.signal.find_peaks 图