基于列获取第一行和最后一行日期时间记录



我有一个包含多个列的df,在Python中无法理解如何只获取每个id的第一个和最后一个日期/时间(列在pandas datetime64[ns]Dtype中(条目的行。此外,如何创建一个以天为单位的日期时间差的新df?

这是一个df切片:

021-03-28 18:55:44021-03-30 18:55:45//tr>
user_id length datetime
d8366132199 20 2021-03-31 17:55:44
d8366132199 40 2021-05-12 13:55:48
d8366132199
d8366132199 70 2021-06-25 17:58:47
d8366132199 80 2021-06-28 18:55:49
e8172920273 10
e8172920273 50
e8172920273 60 2021-05-26 18:55:46
e8172920273 90 2021-05-26 18:55:47

您可以获得每组的idxmin/idxmax,然后使用这些值对原始数据集进行切片:

# get the indices of min/max per group, then flatten as array
idx = df.groupby('user_id')['datetime'].agg(['idxmin', 'idxmax']).values.ravel()
# array([0, 4, 5, 8])
# slice
df.loc[idx]

输出:

user_id  length            datetime
0  d8366132199       20 2021-03-31 17:55:44
4  d8366132199       80 2021-06-28 18:55:49
5  e8172920273       10 2021-03-28 18:55:44
8  e8172920273       90 2021-05-26 18:55:47

对于第一个问题,您可以使用.nth()

ndf = df.sort_values('datetime').groupby('user_id',as_index = False).nth([0,-1])

g = df.groupby('user_id')['datetime']
mins,maxs = g.transform('min'),g.transform('max')
df.loc[df['datetime'].eq(mins) | df['datetime'].eq(maxs)]

输出:

user_id  length            datetime
5  e8172920273      10 2021-03-28 18:55:44
0  d8366132199      20 2021-03-31 17:55:44
8  e8172920273      90 2021-05-26 18:55:47
4  d8366132199      80 2021-06-28 18:55:49

从那里,要回答第二个问题,你可以从第一行减去最后一行。

(ndf.groupby('user_id',as_index = False)
.agg(date_diff = ('datetime',lambda x: (x.iloc[-1] - x.iloc[0]).days)))

输出:

user_id  date_diff
0  d8366132199         89
1  e8172920273         59

相关内容

  • 没有找到相关文章

最新更新