我有以下数据类型:
id start end count Time Trip
001 Paris London 01 2016-05-20 10:50:00 Yes
015 Paris London 01 2016-05-19 11:50:00 Yes
002 Prague Vienna 15 2016-05-18 17:55:00 No
003 Frankfurt London 01 2016-05-17 21:15:00 Yes
015 London Paris 08 2016-05-21 13:50:00 No
003 Barcelona Vienna 15 2016-05-19 03:20:00 No
003 London Barcelona 01 2016-05-18 06:45:00 Yes
002 Vienna Prague 15 2016-05-19 02:45:00 No我想按他们的身份和时间对数据进行分组;
并确认往返行程。简而言之,如果它满足以下条件,
1.第一行的“结束”城市等于下一行的“开始”城市
2.第一线的“开始”城市等于下一行的“终点”城市,
“新开始”是第一行的开始,“新的结束”是第一行的结尾。
例如,让我们考虑id 002,
002 Prague Vienna 15 2016-05-18 17:55:00 No
002 Vienna Prague 15 2016-05-19 02:45:00 No这是往返旅行。所以“新起点”是布拉格,“新终点”是维也纳。
谢谢!id 015的情况也是一样。
发布于 2017-08-03 18:51:25
这是我的方法
#create mirror values
df['M1'],df['M2'] = df['start'] + df['end'],df['end'] + df['start']
#keep values that exist back and forth
df = df.loc[(df.M1.isin(df.M2))].iloc[:,:6]
#drop where id is less than one
df.drop(df.id.count() <= 1,inplace=True)
#sort output
df.sort_values(by=['id','Time'],ascending=[True,True],inplace=True)这会导致
id start end count Time Trip
2 2 Prague Vienna 15 5/18/2016 17:55 No
7 2 Vienna Prague 15 5/19/2016 2:45 No
1 15 Paris London 1 5/19/2016 11:50 Yes
4 15 London Paris 8 5/21/2016 13:50 No发布于 2017-08-03 19:05:58
a. Groupby id
df.groupby("id")b.按Time排序“:
x.sort_values("Time") # x is a subset of df with identical `id`
d = x.sort_values("Time")[["start", "end"]].values检查相邻记录是否有start和end的交换。
isloop = [all(i[0] == i[1][::-1]) for i in zip(d[:-1], d[1:])]所以完整的代码是:
def func(x):
d = x.sort_values("Time")[["start", "end"]].values
isloop = [all(i[0] == i[1][::-1]) for i in zip(d[:-1], d[1:])]
return x[:-1][isloop]
df.groupby("id").apply(func)结果是:
Time Trip count end id start
id
2 2 2016-05-18 17:55:00 No 15 Vienna 2.0 Prague
15 1 2016-05-19 11:50:00 Yes 01 London 15.0 Parishttps://stackoverflow.com/questions/45488098
复制相似问题