首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在往返的基础上找到新的起点和新的终点?

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

Stack Overflow用户
提问于 2017-08-03 15:06:09
回答 2查看 51关注 0票数 0

我有以下数据类型:

代码语言:javascript
复制
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,

代码语言:javascript
复制
002     Prague     Vienna        15      2016-05-18 17:55:00      No
002     Vienna     Prague        15      2016-05-19 02:45:00      No

这是往返旅行。所以“新起点”是布拉格,“新终点”是维也纳。

谢谢!id 015的情况也是一样。

EN

回答 2

Stack Overflow用户

发布于 2017-08-03 18:51:25

这是我的方法

代码语言:javascript
复制
#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)

这会导致

代码语言:javascript
复制
   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
票数 0
EN

Stack Overflow用户

发布于 2017-08-03 19:05:58

a. Groupby id

代码语言:javascript
复制
df.groupby("id")

b.按Time排序“:

代码语言:javascript
复制
x.sort_values("Time") # x is a subset of df with identical `id`
d = x.sort_values("Time")[["start", "end"]].values

检查相邻记录是否有start和end的交换。

代码语言:javascript
复制
isloop = [all(i[0] == i[1][::-1]) for i in zip(d[:-1], d[1:])]

所以完整的代码是:

代码语言:javascript
复制
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)

结果是:

代码语言:javascript
复制
                     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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45488098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档