代码之家  ›  专栏  ›  技术社区  ›  HT121

根据条件计算从一个位置到另一个位置的跳转次数

  •  1
  • HT121  · 技术社区  · 6 年前

    我有下面的数据帧。

        id  start   finish  location
    0   1   2015-12-14 16:44:00 2015-12-15 18:00:00 A
    1   1   2015-12-15 18:00:00 2015-12-16 13:00:00 B
    2   1   2015-12-16 13:00:00 2015-12-16 20:00:00 C
    3   2   2015-12-10 13:15:00 2015-12-12 13:45:00 B
    4   2   2015-12-12 13:45:00 2015-12-12 19:45:00 A
    5   3   2015-12-15 07:45:00 2015-12-15 18:45:00 A
    6   3   2015-12-15 18:45:00 2015-12-18 07:15:00 D
    7   3   2015-12-18 07:15:00 2015-12-19 10:45:00 C
    8   3   2015-12-19 10:45:00 2015-12-20 09:00:00 H
    9   4   2015-12-09 10:45:00 2015-12-13 12:20:00 E
    10  4   2015-12-13 12:20:00 2015-12-13 18:20:00 A
    11  4   2015-12-13 18:20:00 2015-12-13 23:40:00 A
    12  4   2015-12-13 23:40:00 2015-12-16 08:00:00 B
    13  5   2015-12-07 08:00:00 2015-12-13 12:25:00 H
    

    我想计算每个“id”中从一个位置到另一个位置的跳跃。对于这些跳转计数,首先我想将finish列的日期和时间与同一id的下一行的start列的日期和时间进行比较。如果匹配,我想将计数设为1或0。我想得到的是:

        id  start   count
    0   1   2015-12-14 16:44:00 1
    1   1   2015-12-15 18:00:00 1
    2   1   2015-12-16 13:00:00 0
    3   2   2015-12-10 13:15:00 1
    4   2   2015-12-12 13:45:00 0
    5   3   2015-12-15 07:45:00 1
    6   3   2015-12-15 18:45:00 1
    7   3   2015-12-18 07:15:00 1
    8   3   2015-12-19 10:45:00 0
    9   4   2015-12-09 10:45:00 1
    10  4   2015-12-13 12:20:00 1
    11  4   2015-12-13 18:20:00 1
    12  4   2015-12-13 23:40:00 0
    13  5   2015-12-07 08:00:00 0
    

    date    count_sum
    2015-12-07  0
    2015-12-09  1
    2015-12-10  1
    2015-12-12  0
    2015-12-13  2
    2015-12-14  1
    2015-12-15  3
    2015-12-16  0
    2015-12-18  1
    2015-12-19  0
    

    对我来说,最后一部分很容易做到,根据日期执行groupby(),并使用.sum()来汇总该日期的所有计数。但如何得到第一部分,我们计算实际跳跃是不清楚的。任何帮助都将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  2
  •   ALollz    6 年前

    您的数据似乎已按 'start' 所以你可以 groupby 并检查完成时间是否与下一行的开始时间相同 pandas.Series.shift()

    我建议不要叫专栏 'count' 因为这是熊猫的内置功能,所以不能使用 Series.col_name 符号。

    #df['start'] = pd.to_datetime(df.start)
    #df['finish'] = pd.to_datetime(df.finish)
    df['count'] = (df.groupby('id').apply(lambda x: x.finish == x.start.shift(-1))
                     .astype('int').reset_index(level=0, drop=True))
    

        id               start              finish location  count
    0    1 2015-12-14 16:44:00 2015-12-15 18:00:00        A      1
    1    1 2015-12-15 18:00:00 2015-12-16 13:00:00        B      1
    2    1 2015-12-16 13:00:00 2015-12-16 20:00:00        C      0
    3    2 2015-12-10 13:15:00 2015-12-12 13:45:00        B      1
    4    2 2015-12-12 13:45:00 2015-12-12 19:45:00        A      0
    5    3 2015-12-15 07:45:00 2015-12-15 18:45:00        A      1
    6    3 2015-12-15 18:45:00 2015-12-18 07:15:00        D      1
    7    3 2015-12-18 07:15:00 2015-12-19 10:45:00        C      1
    8    3 2015-12-19 10:45:00 2015-12-20 09:00:00        H      0
    9    4 2015-12-09 10:45:00 2015-12-13 12:20:00        E      1
    10   4 2015-12-13 12:20:00 2015-12-13 18:20:00        A      1
    11   4 2015-12-13 18:20:00 2015-12-13 23:40:00        A      1
    12   4 2015-12-13 23:40:00 2015-12-16 08:00:00        B      0
    13   5 2015-12-07 08:00:00 2015-12-13 12:25:00        H      0
    

    为了完整起见:

    df.groupby(df.start.dt.date)['count'].sum()
    start
    2015-12-07    0
    2015-12-09    1
    2015-12-10    1
    2015-12-12    0
    2015-12-13    2
    2015-12-14    1
    2015-12-15    3
    2015-12-16    0
    2015-12-18    1
    2015-12-19    0