【问题标题】:How to make previous and next columns in dataframe from existing dataframe?如何从现有数据框中制作数据框中的上一列和下一列?
【发布时间】:2020-07-07 02:21:04
【问题描述】:

所以,假设我有一个这样的数据框。

df = pd.DataFrame({'person':['A', 'A', 'B', 'B', 'A'],
                   'datetime':['2018-02-26 10:49:32', '2018-02-26 10:58:03', '2018-02-26 10:51:10','2018-02-26 10:58:45', '2018-02-26 10:43:34'], 
                   'location':['a', 'b', 'c', 'd', 'e']})

这表明

person  datetime    location
    A   2018-02-26 10:49:32 a
    A   2018-02-26 10:58:03 b
    B   2018-02-26 10:51:10 c
    B   2018-02-26 10:58:45 d
    A   2018-02-26 10:43:34 e

然后我根据每个人和时间对它们进行排序

df.sort_values(by=['person', 'datetime'])

这会按每个人的时间排序。

person  datetime    location
4   A   2018-02-26 10:43:34 e
0   A   2018-02-26 10:49:32 a
1   A   2018-02-26 10:58:03 b
2   B   2018-02-26 10:51:10 c
3   B   2018-02-26 10:58:45 d

这可以理解为 A 从地点 e 去,然后去 a,然后去 b。与此同时,B 人从 c 地到 d 地。

我想创建一个跟踪每个人的运动的数据框,像这样。

| person | prev_datetime       | prev_loc | next_datetime       | next_loc |
|--------|---------------------|----------|---------------------|----------|
| A      | 2018-02-26 10:43:34 | e        | 2018-02-26 10:49:32 | a        |
| A      | 2018-02-26 10:49:32 | a        | 2018-02-26 10:58:03 | b        |
| B      | 2018-02-26 10:51:10 | c        | 2018-02-26 10:58:45 | d        |

我真的不知道该怎么做。谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用DataFrameGroupBy.shift 2 列,最后删除person 列的最后重复行Series.duplicatedrename 列:

    df['datetime'] = pd.to_datetime(df['datetime'])
    df1 = df.sort_values(by=['person', 'datetime'])
    
    df1[['next_datetime','next_loc']] = df1.groupby('person')['datetime','location'].shift(-1)
    d = {'datetime':'prev_datetime','location':'prev_loc'}
    df2 = df1[df1['person'].duplicated(keep='last')].rename(columns=d)
    print (df2)
      person       prev_datetime prev_loc       next_datetime next_loc
    4      A 2018-02-26 10:43:34        e 2018-02-26 10:49:32        a
    0      A 2018-02-26 10:49:32        a 2018-02-26 10:58:03        b
    2      B 2018-02-26 10:51:10        c 2018-02-26 10:58:45        d
    

    【讨论】:

    • 哇,非常感谢@jezrael。让我先尝试理解它,因为我以前从未使用过DataFrameGroupBy.shift。但似乎在这里你覆盖了现有的数据框。是否有可能制作一个全新的数据框?
    • @catris25 - 当然,答案是edited
    • 太棒了!谢谢@jezrael。我能问点什么吗? .shift() 这里的目的是什么?我试图阅读文档,但我不确定我是否理解。
    • @catris25 - 它改变每组的值,如果在df1[['next_datetime','next_loc']] = df1.groupby('person')['datetime','location'].shift(-1) 之后添加print (df1) 可能会更好看,相同的原则,但使用默认shift(1) 移动here
    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 2021-01-07
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多