计算DataFrame中每笔交易不同类别的前一笔交易金额

问题描述 投票:0回答:1

我有一个 DataFrame

df
,其中包含来自客户的交易。 DataFrame 中的每一行代表一个事务并具有以下列:

  • KEY_ID
    :进行交易的客户ID。
  • TYPE
    :交易类型,可以分为两类。
  • DATE
    :交易进行的日期。
  • AMOUNT
    :交易金额。

我需要向 DataFrame 添加一个新列,其中包含每笔交易的相反类别的上一笔交易的金额。也就是说,对于某种类型的每笔交易,我想知道同一客户在当前交易日期之前进行的最后一笔不同类型的交易金额是多少。

首先我按

df
KEY_ID
DATE
进行排序:

df= df.sort_values(by=['KEY_ID', 'FECHA'])

然后尝试创建一个函数来创建一个名为

previous_requests

的子集
def find_previous_request(row):
    # Get previous requests of the opposite type
    previous_requests = df[
        (df['KEY_ID'] == row['KEY_ID']) &
        (df['TYPE'] != row['TYPE']) &
        (df['DATE'] < row['DATE'])
    ]
    
    # If there are previous requests, return the amount of the most recent one
    if not previous_requests.empty:
        return previous_requests.iloc[-1]['AMOUNT']
    
    # If there are no previous requests, return NaN
    return np.nan

当我应用该功能时,内核崩溃了。

还尝试了以下代码:

df['prev_amount'] = df.groupby(['KEY_ID', 'TYPE'])['AMOUNT'].shift().fillna(0).astype(int)

编辑:

输入:

KEY_ID 类型 金额 日期
1 电机 5000 2020-01-01
1 工具 3000 2020-02-01
1 工具 7000 2020-03-01
2 工具 2000 2020-01-15
2 电机 6000 2020-02-15
2 工具 4000 2020-03-15

预期输出:

KEY_ID 类型 金额 日期 PREV_AMOUNT
1 电机 5000 2020-01-01 NaN
1 工具 3000 2020-02-01 5000
1 工具 7000 2020-03-01 5000
2 工具 2000 2020-01-15 NaN
2 电机 6000 2020-02-15 2000
2 工具 4000 2020-03-15 6000
python pandas sorting data-manipulation
1个回答
0
投票

迭代按日期排序的行,并跟踪到目前为止的最后一笔交易并随着您的向下更新:

last_motor = None
last_tool = None

for ind, row in df.sort_values('DATE').iterrows():
    if row.TYPE == 'Motor':
        df.loc[ind, 'PREV_AMOUNT'] = last_tool
        last_motor = row.AMOUNT
    if row.TYPE == 'Tool':
        df.loc[ind, 'PREV_AMOUNT'] = last_motor
        last_tool = row.AMOUNT
© www.soinside.com 2019 - 2024. All rights reserved.