gpt4 book ai didi

python - 如何使用 Pandas 获取每个组中的上一个和中间日期

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:58 24 4
gpt4 key购买 nike

我有以下数据框:

df = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,2,2,2,2,2],
'time_1' :['2173/04/01 12:35:00','2173/04/01 12:50:00','2173/04/02 12:59:00','2173/04/02 13:14:00','2173/04/04 13:37:00','2173/04/06 13:39:00','2173/04/06 11:30:00','2173/04/08 16:00:00','2173/04/09 22:00:00','2173/04/11 04:00:00','2173/04/13 04:30:00','2173/04/14 08:00:00'],
'val' :[0,0,0,0,1,0,0,0,0,0,0,0]
})
df['time_1'] = pd.to_datetime(df['time_1'])
df['day'] = df['time_1'].dt.day

enter image description here

我想做的是,根据下面给出的条件,为每个主题分配两天时间

val = 1- 获取前两天(从 val = 1)

val = 0- 获取他持续时间的中间两天

这是我尝试过的方法,但它既不优雅也不准确。

con = lambda x: (x.eq(1))
con_1 = lambda x: (x.eq(0))
df.loc[df.groupby('subject_id')['val'].transform(con)]['time_1'] - timedelta(days = 2)

以下是我的预期输出:

enter image description here

subject = 1val = 1,所以我们从 val = 1 得到他和 subject 的前两天= 2,因为没有 val = 1,我们得到 他持续时间的中间 2 天(第 8 - 14 日)

最佳答案

我相信你需要:

def func(x):
floor = x['time_1'].dt.floor('d')

if (x['val'].any()):
date = x.loc[x['val'] == 1, 'time_1'].iat[0].floor('d')
new_date = date - pd.Timedelta(3, unit='d')
return (x[floor.between(new_date, date, inclusive=False)])
else:
date = floor.mean().floor('d')
new_date = date + pd.Timedelta(1, unit='d')
return (x[floor.between(date, new_date)])

df = df.groupby('subject_id', group_keys=False).apply(func)
print (df)
subject_id time_1 val day
2 1 2173-04-02 12:59:00 0 2
3 1 2173-04-02 13:14:00 0 2
9 2 2173-04-11 04:00:00 0 11

关于python - 如何使用 Pandas 获取每个组中的上一个和中间日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57864240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com