我有以下数据类型:
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
我想按照他们的ID和时间对数据进行分组;
并确定往返行程。简而言之,如果它满足以下条件,
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的情况下也是如此。
答案 0 :(得分:0)
这是我的方法
#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
答案 1 :(得分:0)
一个。 Groupby id
:
df.groupby("id")
湾按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 Paris