如何根据往返找到新的开始和新的结束?

时间:2017-08-03 15:06:09

标签: python pandas

我有以下数据类型:

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的情况下也是如此。

2 个答案:

答案 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

℃。检查邻接记录对是否具有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