我有一个 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 |
迭代按日期排序的行,并跟踪到目前为止的最后一笔交易并随着您的向下更新:
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