如何在往返的基础上找到新的起点和终点?

2024-10-06 11:21:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据类型:

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时相同


Tags: noidtimecountstartyesend数据类型
2条回答

答。分组依据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

c。检查相邻记录对是否有startend的交换

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

这是我的方法

#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

相关问题 更多 >