根据数据帧中的条件累积值

2024-04-24 05:37:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框(用来说明预期的行为),如下所示:

df = pd.DataFrame({
        'Id': ['001', '001', '002', '002'],
        'Date': ['2013-01-07', '2013-01-14', '2013-01-07', '2013-01-14'],
        'Purchase_Quantity': [12, 13, 10, 6],
        'lead_time': [4, 2, 6, 4],
        'Order_Quantity': [21, 34, 21, 13]
    })
    df['Date'] = pd.to_datetime(df['Date'])
    df = df.groupby(['Id', 'Date']).agg({
        'Purchase_Quantity': sum,
        'lead_time': sum,
        'Order_Quantity': sum})
                Purchase_Quantity  lead_time  Order_Quantity
Id  Date                                                    
001 2013-01-07                 12          4              21
    2013-01-14                 13          2              34
002 2013-01-07                 10          6              21
    2013-01-14                  6          4              13

其中lead_time是以天为单位的持续时间。你知道吗

我想添加一个列来跟踪“现存量”,即:

  • 前几周的剩余数量
  • 加上最终可用的订购数量
  • 减去本周采购数量

Equation

预期结果应为:

                Purchase_Quantity  lead_time  Order_Quantity  OH
Id  Date                                                    
001 2013-01-07                 12          4              21   0
    2013-01-14                 13          2              34   9
002 2013-01-07                 10          6              21   0
    2013-01-14                  6          4              13  11

Tags: to数据iddataframedf数量datetimedate
1条回答
网友
1楼 · 发布于 2024-04-24 05:37:10

我认为应该关注^{}来构建新行(而不是迭代数据帧行)。你知道吗

这是第一次尝试。我将更新它,以更好地匹配您试图实现在您的编辑。你知道吗

diff = df['Order_Quantity'] - df['Purchase_Quantity']
acc = list(itertools.accumulate(diff))
df['on_hand'] = acc
print(df)

编辑

我想我误解了你想要达到的目标。你知道吗

这是您的基本数据框:

                Purchase_Quantity  lead_time  Order_Quantity
Id  Date                                                    
001 2013-01-07                 12          4              21
    2013-01-14                 13          2              34
002 2013-01-07                 10          6              21
    2013-01-14                  6          4              13

据我所知,On Hand列必须报告尚未到达的“已购买”项目的数量。看这样的东西:

                Purchase_Quantity  lead_time  On_Hand
Id  Date                                                    
001 2013-01-07                 12          4       12
    2013-01-14                 13          2       25  # (12 + 13)
002 2013-01-07                 10          6       10
    2013-01-14                  6          4       16  # (10 + 6)

我明白了吗?如果是,那么Order_Quantity是什么意思?你知道吗


编辑2

这里有一个新的例子,很大程度上受到this post的启发,它似乎与您的用例相匹配。你知道吗

我更改了列名以避免混淆(在我的语言中,“Order”和“Purchase”翻译成同一个词有什么区别…)。 您还应该将提前期转换为datetime.timedelta对象,使单位和计算更加清晰。你知道吗

import pandas as pd


def main():
    df = pd.DataFrame({
        'Id': ['001', '001', '002', '002'],
        'Date': ['2013-01-07', '2013-01-14', '2013-01-07', '2013-01-14'],
        'Ordered': [21, 34, 21, 13],
        'LeadTime': [4, 2, 6, 4],
        'Sold': [12, 13, 10, 6],
    })
    df['Date'] = pd.to_datetime(df['Date'])
    df['LeadTime'] = pd.to_timedelta(df['LeadTime'], unit="days")
    print(df)

    df['Received'] = df.apply(lambda x: df.loc[(df['Date']+df['LeadTime'] <= x['Date']) & (df['Id'] == x['Id']), "Ordered"].sum(), axis=1)
    df['Diff'] = df['Received'] - df['Sold']
    print(df)

if __name__ == '__main__':
    main()

如图所示,您可能需要分两步完成。首先构建一个新列,其值取决于行的当前值(请参阅链接的文章)。然后做其他可以矢量化的计算。你知道吗

这还不能提供预期的输出,但我认为这是一个很好的起点。你知道吗

相关问题 更多 >