У меня есть два следующих кадра данных:
Первый кадр данных содержит расписание автобусов с номерами автобусов, идентификаторами остановок и названиями остановок.
1.df_time:
bus_nr stop_id stop_name
0 1 1 a
1 1 2 b
2 1 3 c
3 1 4 d
4 2 1 k
5 2 2 l
6 2 3 m
7 2 4 n
8 2 5 o
Второй кадр данных содержит некоторые измерения того, где была шина, но некоторые остановки отсутствуют.Кадр содержит bus_nr, имя остановки, идентификатор поездки и другую информацию:
2.df_measure:
bus_nr trip_id stop_name other
0 1 1 a x
1 1 1 b x
2 1 1 d x
3 1 2 c x
4 1 2 d x
5 2 3 k x
6 2 3 m x
7 2 3 n x
Теперь я хочу объединить отсутствующие значения из расписания с измеренными остановками, чтобы все измерения расписания происходили в измерении:
bus_nr trip_id stop_id stop_name other
0 1 1 1 a x
1 1 1 2 b x
2 1 1 3 c NaN
3 1 1 4 d x
4 1 2 1 a NaN
5 1 2 2 b NaN
6 1 2 3 c x
7 1 2 4 d x
8 2 3 1 k x
9 2 3 2 l NaN
10 2 3 3 m x
11 2 3 4 n x
12 2 3 5 o NaN
Итакдля каждого bus_nr я хочу использовать всю информацию из df_time и вставить ее в df_measure .Есть идеи?
Код для создания Dataframes:
df_time = pd.DataFrame()
df_time['bus_nr'] = [1, 1, 1, 1, 2, 2, 2, 2, 2]
df_time['stop_id'] = [1, 2, 3, 4, 1, 2, 3, 4, 5]
df_time['stop_name'] = ['a', 'b', 'c', 'd', 'k', 'l', 'm', 'n', 'o']
df_measure = pd.DataFrame()
df_measure['bus_nr'] = [1, 1, 1, 1, 1, 2, 2, 2]
df_measure['trip_id'] = [1, 1, 1, 2, 2, 3, 3, 3]
df_measure['stop_name'] = ['a', 'b', 'd', 'c', 'd', 'k', 'm', 'n']
df_measure['other'] = ['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
Решение:
С помощью Сагар Дауда я нашел решение, которое работает:
1.Создайте фрейм данных со всеми комбинациями bus_nr и trip_nr
df_combi = df_measure[['bus_nr', 'trip_id']].copy()
df_combi = df_combi.loc[df_combi.duplicated(['bus_nr', 'trip_id'], keep='first')==False]
2.Используйте решение Sagar Dawda
out = pd.merge_ordered(df_time, df_measure, right_by='trip_id', how='outer')
out = out.loc[:, ['bus_nr', 'trip_id', 'stop_id', 'stop_name', 'other']]
3.Слияние
out.merge(df_combi)