我有一个数据集,其中包含许多与不同船只和港口相关的时间戳。
obj_id timestamp port
0 4 2019-10-01 Houston
1 2 2019-09-01 New York
2 4 2019-07-31 Boston
3 1 2019-07-28 San Francisco
4 2 2019-10-15 Miami
5 1 2019-09-01 Honolulu
6 1 2019-08-01 Tokyo
我想通过将每个obj_id的最新时间戳/端口分配为“目的地”,将第二个最新时间戳/端口分配为“,来构建一个包含单个船舶最新航行记录(obj_id)的数据框。起源'。因此,最终结果将如下所示:
obj_id origin_time origin_port destination_time destination_port
0 4 2019-07-31 Boston 2019-10-01 Houston
1 2 2019-09-01 New York 2019-10-15 Miami
3 1 2019-07-28 Tokyo 2019-09-01 Honolulu
我已经通过此代码成功过滤了每个obj_id的最新时间戳,但仍然找不到找到 second 最新时间戳的方法,更不用说将它们都拉成一行了。 / p>
df.sort_values(by ='timestamp', ascending = False).drop_duplicates(['obj_id'])
答案 0 :(得分:0)
将groupby.agg
与first, last
一起使用:
dfg = df.sort_values('timestamp').groupby('obj_id').agg(['first', 'last']).reset_index()
dfg.columns = [f'{c1}_{c2}' for c1, c2 in dfg.columns]
obj_id_ timestamp_first timestamp_last port_first port_last
0 1 2019-07-28 2019-09-01 San Francisco Honolulu
1 2 2019-09-01 2019-10-15 New York Miami
2 4 2019-07-31 2019-10-01 Boston Houston
答案 1 :(得分:0)
您想按时间戳对行程进行排序,以便我们可以获取最新的航程,然后按对象ID对航程进行分组,并获取每个对象的第一和第二航程,然后合并。
groups = df.sort_values(by = "timestamp", ascending = False).groupby("obj_id")
pd.merge(groups.nth(1), groups.nth(0),
on="obj_id",
suffixes=("_origin", "_dest"))
但是请确保您的时间戳列是正确的时间戳数据类型,否则您的排序将会混乱。