pandas 从给定参数中选择上一行

oknrviil  于 2023-05-05  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个 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

任何帮助是高度赞赏。谢谢你!

rjjhvcjd

rjjhvcjd1#

您的代码几乎可以工作:

# see the ascending param
df = df.sort_values(by=['id', 'date'], ascending=[True,False]) # sort the dataframe by patient_id and date

time_diff = df.groupby('id')['date'].diff() # calculate time difference between consecutive rows for each patient

# see the different comparison
mask = (time_diff < pd.Timedelta(days=-365)) | time_diff.isna() # find rows where the time difference is greater than or equal to 1 year or null (first row for each id)

# just mask here
df[mask]

输出:

id  code       date
0   1    37 2022-01-11
2   1    39 2019-02-11
6   1    39 2017-03-20

相关问题