给定以下数据框:
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,你可以做 groupby
和 nunique
:
# 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/