繁体   English   中英

Pandas 根据同一列中的先前值更改值

[英]Pandas change values based on previous value in same column

我有以下数据框:

在此处输入图像描述

import pandas as pd
import datetime
df = pd.DataFrame({'ID': [1, 2, 1, 1], 
                         'Date' : [datetime.date(year=2022,month=5,day=1), datetime.date(year=2022,month=11,day=1),
                                                       datetime.date(year=2022,month=10,day=1), datetime.date(year=2022,month=11,day=1)], 
                         "Lifecycle ID": [5,5,5,5]})

我需要根据 6 个月前的生命周期更改生命周期(如果它是 5,它应该始终是 6(而不是 +1))。

我目前正在尝试:

df.loc[(df["Date"] == (df["Date"] - pd.DateOffset(months=6))) & (df["Lifecycle ID"] == 5), "Lifecycle ID"] = 6

但是 Pandas没有考虑 ID ,我不知道如何。

输出应该是这个数据框(只有最后一个生命周期 ID 更改为 6):

在此处输入图像描述

你能帮我吗?

逻辑不是很清楚,但如果我猜对的话:

# ensure datetime type
df['Date'] = pd.to_datetime(df['Date'])

# add the time delta to form a helper DataFrame
df2 = df.assign(Date=df['Date'].add(pd.DateOffset(months=6)))

# merge on ID/Date, retrieve "Lifecycle ID"
# and check if the value is 5
m = df[['ID', 'Date']].merge(df2, how='left')['Lifecycle ID'].eq(5)

# if it is, update the value
df.loc[m, 'Lifecycle ID'] = 6

如果要从 6 个月前的值自动递增该值:

s = df[['ID', 'Date']].merge(df2, how='left')['Lifecycle ID']

df.loc[s.notna(), 'Lifecycle ID'] = s.add(1)

输出:

   ID       Date  Lifecycle ID
0   1 2022-05-01             5
1   2 2022-11-01             5
2   1 2022-10-01             5
3   1 2022-11-01             6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM