使用其他数据帧的特定值附加数据帧行 - 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 行的第一次迭代:我需要在空数据帧的第一行附加:
- 第一行stop_times的departure_time
- 第二行stop_times的arrival_time
- 第stop_times行的stop_sequence(对应departure_station列)
- 第stop_times行的stop_sequence(对应第arrival_station列)
那会给我以下内容:
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=].
希望这就是您要搜索的内容。
我正致力于在 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 行的第一次迭代:我需要在空数据帧的第一行附加:
- 第一行stop_times的departure_time
- 第二行stop_times的arrival_time
- 第stop_times行的stop_sequence(对应departure_station列)
- 第stop_times行的stop_sequence(对应第arrival_station列)
那会给我以下内容:
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=].
希望这就是您要搜索的内容。