依时序建立资料框

时间:2019-10-22 22:56:55

标签: python pandas dataframe

我有一个数据集,其中包含许多与不同船只和港口相关的时间戳。

   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'])

2 个答案:

答案 0 :(得分:0)

groupby.aggfirst, 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"))

但是请确保您的时间戳列是正确的时间戳数据类型,否则您的排序将会混乱。