我有一个 Dataframe ,看起来像这样:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十七|2022-01-11 2022-01-11 2022-01-11|
| 1|二十二|2021-10-01 -01|
| 1|三十九|2019-02-11 2019-02-11 2019-02-11|
| 1|二十一|2018-10-08 2018-10-08|
| 1|十七岁|2018-09-19 2018-09-19|
| 1|十八岁|2018-09-10 2018-09-10|
| 1|三十九|2017-03-20 2017-03-20|
| 1|三十六|2017-02-28 2017-02-28|
| 1|三十四|2017-02-14 2017-02-14|
| 1|三十一|2017-01-20 2017-01-20|
| 1|二十一|2016-11-17 2016-11-17 2016-11-17|
| 1|十七岁|2016-10-20 2016-10-20|
正如您所看到的,代码在特定的日期差之后重复。我想获得最大时差之前的行。
例如:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|二十二|2021-10-01 -01|
| 1|三十九|2019-02-11 2019-02-11 2019-02-11|
应该给予我输出:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十九|2019-02-11 2019-02-11 2019-02-11|
由于2019年和2021年之间存在显著差异,因此我希望在日期之间存在巨大差异之前的前一行可用。
上述 Dataframe 的输出如下:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十七|2022-01-11 2022-01-11 2022-01-11|
| 1|三十九|2019-02-11 2019-02-11 2019-02-11|
| 1|三十九|2017-03-20 2017-03-20|
这是我尝试的代码,但它只给我每个时间差的第一个值。我尝试了max,min,first和last,但结果都是一样的:
注意:sel是这里的 Dataframe 。我在以前的计算中使用了它,所以我在这里使用相同的名称。
from datetime import datetime, timedelta
sel['date'] = pd.to_datetime(sel['date'], format='%Y%m%d') # convert date column to datetime
sel = sel.sort_values(by=['id', 'date']) # sort the dataframe by patient_id and date
sel['time_diff'] = sel.groupby('id')['date'].diff() # calculate time difference between consecutive rows for each patient
mask = (sel['time_diff'] >= timedelta(days=365)) | (sel['time_diff'].isnull()) # find rows where the time difference is greater than or equal to 1 year or null (first row for each id)
output_df = sel.loc[mask].groupby(['id', 'code']).agg({'date': 'max'}).reset_index() # select the rows where the mask is True and get the max date for each code for each patient
output_df = output_df[['id', 'code', 'date']] # select the desired columns
output_df
任何帮助是高度赞赏。谢谢你!
1条答案
按热度按时间rjjhvcjd1#
您的代码几乎可以工作:
输出: