给定以下数据框:

data = [['2019-06-20 12:28:00', '05123', 2, 8888],
        ['2019-06-20 13:28:00', '55874', 6, 8888],
        ['2019-06-20 13:35:00', '12345', 1, 8888],
        ['2019-06-20 13:35:00', '35478', 2, 1234],
        ['2019-06-20 13:35:00', '12345', 2, 8888],
        ['2019-06-20 14:22:00', '98765', 1, 8888]]

columns = ['pdate', 'station', 'ptype', 'train']
df = pd.DataFrame(data, columns = columns)

其中“pdate”= 通行时间,“station”= 车站代码,“ptype”= 通行类型,“train”= 列车编号

'ptype' 可以有以下值(1=到达,2=出发,6=通过)

这是结果:
                 pdate station  ptype  train
0  2019-06-20 12:28:00   05123      2   8888
1  2019-06-20 13:28:00   55874      6   8888
2  2019-06-20 13:35:00   12345      1   8888
3  2019-06-20 13:35:00   35478      2   1234
4  2019-06-20 13:35:00   12345      2   8888
5  2019-06-20 14:22:00   98765      1   8888

不幸的是有时在车站错误地而不是注册 'ptype"=6 (Pass) 他们输入 'ptype"=1 (Arrival) AND 'ptype"=2 (Departure) 发生在同一时间。所以那 2 条记录我必须认为只是一个通过记录

我必须从数据框中删除每行 ptype=6 或(ptype=1 并且同一车站和同一列车编号的 ptype=2 的下一条记录完全同时发生)

因此,从给定的示例中,我必须删除以下行(1、2、4)

我可以删除 ptype = 6 的所有行
df = df.drop(df[(df['ptype']==6)].index)

但我不知道如何删除其他对。
任何想法?

最佳答案

IIUC,你可以做 groupbynunique :

# convert to datetime. Skip if already is.
df.pdate = pd.to_datetime(df.pdate)

# drop all the 6 records:
df = df[df.ptype.ne(6)]

(df[df.groupby(['pdate','train'])
      .ptype.transform('nunique').eq(1)]
)

输出:
                pdate station  ptype  train
0 2019-06-20 12:28:00   05123      2   8888
3 2019-06-20 13:35:00   35478      2   1234
5 2019-06-20 14:22:00   98765      1   8888

关于python - Pandas 基于 "neighbours"删除行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56807764/

10-12 20:19