使用其他数据帧的特定值附加数据帧行 - python

Appending a dataframe row with specific values of other dataframes - python

我正致力于在 python 中实施 Connexion 扫描算法,因为我需要访问最短的 public 传输路径。所以我正在尝试从 gtfs 文件创建一个连接 table。

我有一个包含以下列的数据框 (stop_times):

    trip_id    arrival_time  departure_time  stop_sequence  stop_id
0   id1        06:02:00      06:02:00        0              stop_id1
1   id1        06:05:00      06:05:00        1              stop_id2
2   id1        06:06:00      06:06:00        2              stop_id3
3   id1        06:08:00      06:08:00        3              stop_id4

原始文件要长得多,包含许多行程的数据,这些行程由 trip_id.

定义

我想将第一个数据帧中包含的一些值保存在第二个数据帧中,该数据帧将列出站点之间的连接并且基本上有四列:

    departure_station  arrival_station  departure_time   arrival_time   

我的目标是从 stop_times 数据框中提取值,并将它们插入到我创建的空行中的正确行中。然而,我遇到了问题,我现在已经被困了很长一段时间。


我需要遍历 stop_times 数据帧 2 "rows at a time" 并在前一行开始新的迭代。第一次迭代将在索引 0-1 上进行,第二次在 1-2 上进行,第三次在 2-3 上进行,依此类推。

现在我只能使用以下代码对第 0-1、2-3 行等进行迭代,但这不是我在这里尝试做的。

for i, g in course.groupby(np.arange(len(course)) // 2):

知道我该怎么做吗?


现在让我们考虑第 0-1 行的第一次迭代:我需要在空数据帧的第一行附加:

那会给我以下内容:

    departure_station  arrival_station  departure_time   arrival_time
0   0                  1                06:02:00         06:05:00

然后对数据帧的其余部分重复该操作:

    departure_station  arrival_station  departure_time   arrival_time
0   0                  1                06:02:00         06:05:00
1   1                  2                06:05:00         06:06:00
2   2                  3                06:06:00         06:08:00

这是我到目前为止尝试过的:

stop_time = pd.read_csv('/Users/im/Downloads/IDFM_gtfs/stop_times.txt')
stop_time = stop_time[:30]

course = stop_time.loc[stop_time['trip_id'] == 'id1']

for i, g in course.groupby(np.arange(len(course)) // 2):
    connexion = g.reset_index()
    connexion = connexion[['trip_id', 'arrival_time', 'departure_time', 'stop_id', 'stop_sequence']]

    dep_hor = connexion.loc[connexion.index == 0, ['departure_time']]
    arriv_hor = connexion.loc[connexion.index == 1, ['arrival_time']]

    table_horaire = table_horaire.append(dep_hor)
    table_horaire = table_horaire.append(arriv_hor)

这给了我以下数据框:

    arrival_time    departure_time  arrival_station  departure_station
0   NaN             06:02:00        NaN              NaN
1   06:05:00        NaN             NaN              NaN
0   NaN             06:06:00        NaN              NaN
1   06:08:00        NaN             NaN              NaN
0   NaN             06:10:00        NaN              NaN
1   06:12:00        NaN             NaN              NaN
0   NaN             06:14:00        NaN              NaN
1   06:16:00        NaN             NaN              NaN

任何帮助将不胜感激,如果某些部分没有得到很好的解释,请告诉我,我在编程方面仍然很新,还不知道所有正确的术语。

如果我答对了你的问题,你根本不需要 groupby,可以结合使用 shift(1) 和 concat 来得到你想要的:

import numpy as np
# make sure the dataframe is sorted by trip_id and arrival_time
# please choose what is better according your data arrival_time 
# or stop_sequence (in case your public transport goes near the
# speed of light :-)
df.sort_values(['trip_id', 'arrival_time'], inplace=True)

# shift the columns, we need for the departure part 
# by one row and rename the columns
df_departure= df[['trip_id', 'stop_id', 'arrival_time']].shift(1)
df_departure.columns= ['departure_trip_id', 'departuere_station', 'departure_time']

# create a subset of the dataframe with the arrival-columns
df_arrival= df[['trip_id', 'arrival_time', 'stop_id']].copy()
df_arrival.columns= ['trip_id', 'arrival_time', 'arrival_station']

# concat both together
df_combined= pd.concat([df_departure, df_arrival], axis='columns')

# now take care of the rows at the beginning of each group 
# of rows that belong to the same trip_id and delete the 
# departure values of theses rows since they belong to another 
# trip
df_combined.loc[df_combined['trip_id'] != df_combined['departure_trip_id'], ['departuere_station', 'departure_time']]= (np.NaN, np.NaN)
df_combined.drop(['departure_trip_id'], axis='columns', inplace=True)

有以下测试数据:

raw="""    trip_id    arrival_time  departure_time  stop_sequence  stop_id
0   id1        06:02:00      06:02:30        0              stop_id1
1   id1        06:05:00      06:05:30        1              stop_id2
2   id1        06:06:00      06:06:30        2              stop_id3
3   id1        06:08:00      06:08:30        3              stop_id4
4   id2        06:12:00      06:12:30        4              stop_id5
5   id2        06:15:00      06:15:30        5              stop_id6
6   id2        06:16:00      06:16:30        6              stop_id7
7   id2        06:18:00      06:18:30        7              stop_id8
"""
df= pd.read_csv(io.StringIO(raw), index_col=0, sep='\s+')

上面的代码输出:

Out[65]: 
  departuere_station departure_time trip_id arrival_time arrival_station
0                NaN            NaN     id1     06:02:00        stop_id1
1           stop_id1       06:02:00     id1     06:05:00        stop_id2
2           stop_id2       06:05:00     id1     06:06:00        stop_id3
3           stop_id3       06:06:00     id1     06:08:00        stop_id4
4                NaN            NaN     id2     06:12:00        stop_id5
5           stop_id5       06:12:00     id2     06:15:00        stop_id6
6           stop_id6       06:15:00     id2     06:16:00        stop_id7
7           stop_id7       06:16:00     id2     06:18:00        stop_id8

如果 stop_id 不是 station 的同义词,您可以在 merge(或 map)之前翻译它19=].

希望这就是您要搜索的内容。