我有一个名为df
的数据框,其中包含客户的交易记录。数据框中的每一行代表一笔交易,并有以下列:
KEY_ID
:进行交易的客户ID。
TYPE
:交易类型,分为两类。
DATE
:交易日期。
AMOUNT
:交易金额。
我需要在该数据框中添加一个新列,该列包含每笔交易前一次相反类型的交易金额。也就是说,对于某类交易,我想知道在当前交易日期之前,同一客户最后一次进行不同类型的交易金额是多少。
首先,我按KEY_ID
和DATE
对df
进行了排序:
df= df.sort_values(by=['KEY_ID', 'DATE'])
然后尝试创建一个函数来生成名为previous_requests
的子集:
def find_previous_request(row):
# 获取与当前行客户相同但类型不同的先前交易
previous_requests = df[
(df['KEY_ID'] == row['KEY_ID']) &
(df['TYPE'] != row['TYPE']) &
(df['DATE'] < row['DATE'])
]
# 如果存在先前的交易记录,返回最近一笔交易的金额
if not previous_requests.empty:
return previous_requests.iloc[-1]['AMOUNT']
# 如果不存在先前的交易记录,返回NaN
return np.nan
问题在于应用此函数时内核崩溃了。
我还尝试了以下代码:
df['prev_amount'] = df.groupby(['KEY_ID', 'TYPE'])['AMOUNT'].shift().fillna(0).astype(int)
编辑:
输入示例:
| KEY_ID | TYPE | AMOUNT | DATE |
|--------|--------|--------|------------|
| 1 | Motor | 5000 | 2020-01-01 |
| 1 | Tool | 3000 | 2020-02-01 |
| 1 | Tool | 7000 | 2020-03-01 |
| 2 | Tool | 2000 | 2020-01-15 |
| 2 | Motor | 6000 | 2020-02-15 |
| 2 | Tool | 4000 | 2020-03-15 |
期望输出结果:
| KEY_ID | TYPE | AMOUNT | DATE | PREV_AMOUNT |
|--------|--------|--------|------------|-------------|
| 1 | Motor | 5000 | 2020-01-01 | NaN |
| 1 | Tool | 3000 | 2020-02-01 | 5000 |
| 1 | Tool | 7000 | 2020-03-01 | 5000 |
| 2 | Tool | 2000 | 2020-01-15 | NaN |
| 2 | Motor | 6000 | 2020-02-15 | 2000 |
| 2 | Tool | 4000 | 2020-03-15 | 6000 |