首页 > 解决方案 > 有没有办法优化熊猫中的 itterrows 代码?

问题描述

这是输入数据

期末库存值仅通过添加期初库存、购买数量和已售数量来计算期初库存值。

输入数据

我想在有条件的情况下为“期初股票”和“期末股票”添加值。

  1. 当期初股票值为0或为空时,应填写上一次记录的期末股票
  2. 仅当此记录和先前记录的站点和项目代码相同时才应进行填充

对于 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]

这就是输出的样子

在此处输入图像描述

问题是由于数据集的大小很大,因此需要数小时才能完成。

有没有办法优化这段代码?

标签: pythonpandasiteration

解决方案


您可以在没有任何迭代方法的情况下做到这一点。第一步是将0值转换为Opening Stocknp.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']

推荐阅读