我有一个包含多个列的df,在Python中无法理解如何只获取每个id的第一个和最后一个日期/时间(列在pandas datetime64[ns]Dtype中(条目的行。此外,如何创建一个以天为单位的日期时间差的新df?
这是一个df切片:
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 | 021-03-28 18:55:44|
e8172920273 | 50 | 021-03-30 18:55:45//tr>|
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