Форум сайта python.su
Ребята, привет!
Есть вот такой датасет маршрутов, нужно объединить транзитные поездки, транзитная поездка считается если дата не больше 1 дня.
import pandas as pd data = {'ФИО': ['Иванов Иван Иванович', 'Петров Власий Константинович', 'Иванов Иван Иванович', 'Иванов Иван Иванович'], 'Маршрут': ['МСК-ТЛН', 'КРД-ВВО', 'ТЛЧ-ВВО', 'ВВО-ЮЖН'], 'Дата' : ['12.11.2022', '15.11.2022','13.11.2022', '15.11.2022'], 'Стоимость': [15000, 25000, 5000 , 14000]} df = pd.DataFrame(data)
data1 = {'ФИО': ['Иванов Иван Иванович', 'Петров Власий Константинович', 'Иванов Иван Иванович'], 'Маршрут': ['МСК-ТЛН-ВВО', 'КРД-ВВО', 'ВВО-ЮЖН'], 'Дата' : ['12.11.2022', '15.11.2022', '15.11.2022'], 'Стоимость': [20000, 25000, 14000]} df1 = pd.DataFrame(data1)
Отредактировано lenassakh (Дек. 17, 2022 11:05:36)
Офлайн
Один из способов решения этой задачи - использовать метод groupby из библиотеки Pandas.
Сначала нужно создать новый столбец, который будет содержать только дату без времени. Для этого можно использовать функцию pd.to_datetime:
df['Дата'] = pd.to_datetime(df['Дата'], format='%d.%m.%Y')
df['Дата'] = df['Дата'].dt.date
def combine_routes(group): group['Маршрут'] = '-'.join(group['Маршрут']) return group
df = df.groupby(['ФИО', 'Дата']).apply(combine_routes)
Отредактировано AD0DE412 (Дек. 17, 2022 11:38:22)
Офлайн
че как?
Офлайн
AD0DE412
df = df.groupby().apply(combine_routes)
Отредактировано lenassakh (Дек. 17, 2022 11:44:52)
Офлайн
сори я немного эээ короче это код генерированый ai просто хотелось проверить на ком то эээ и еще раз сорян
если вам интересно продолжение
Так не получится, так как пассажир вылетел 12.11.2022, а следующий рейс был уже 13.11.2022, и group by не объединяет их.-
Я думала объединить по периоду, но не нашла как указать 2 дня, чтобы 12.11.2022 и 13.11.2022 группировалось одной строкой. Или период 48 часов
df['Дата'] = pd.to_datetime(df['Дата'], format='%d.%m.%Y') df['Разница в днях'] = df['Дата'].diff().dt.days
df = df[df['Разница в днях'] < 2].groupby('ФИО').apply(combine_routes)
df['Разница в часах'] = df['Дата'].diff().dt.total_seconds() / 3600 df = df[df['Разница в часах'] < 48].groupby('ФИО').apply(combine_routes)
def combine_routes(group): combined_route = '-'.join(group['Маршрут']) combined_cost = group['Стоимость'].sum() return pd.Series({'Маршрут': combined_route, 'Стоимость': combined_cost})
df = df.groupby('ФИО').apply(combine_routes).reset_index()
import pandas as pd def combine_transit_trips(df, period): df['Дата'] = pd.to_datetime(df['Дата'], format='%d.%m.%Y') if period == '2 дня': df['Разница'] = df['Дата'].diff().dt.days elif period == '48 часов': df['Разница'] = df['Дата'].diff().dt.total_seconds() / 3600 else: raise ValueError('Неверно указан период') def combine_routes(group): combined_route = '-'.join(group['Маршрут']) combined_cost = group['Стоимость'].sum() return pd.Series({'Маршрут': combined_route, 'Стоимость': combined_cost}) df = df[df['Разница'] < period].groupby('ФИО').apply(combine_routes).reset_index() return df data = {'ФИО': ['Иванов Иван Иванович', 'Петров Власий Константинович', 'Иванов Иван Иванович', 'Иванов Иван Иванович'], 'Маршрут': ['МСК-ТЛН', 'КРД-ВВО', 'ТЛЧ-ВВО', 'ВВО-ЮЖН'], 'Дата' : ['12.11.2022', '15.11.2022','13.11.2022', '15.11.2022'], 'Стоимость': [15000, 25000, 5000 , 14000]} df = pd.DataFrame(data)
result = combine_transit_trips(df, '2 дня') print(result)
result = combine_transit_trips(df, '48 часов') print(result)
Отредактировано AD0DE412 (Дек. 17, 2022 12:08:14)
Офлайн
AD0DE412Благодарю за помощь! Знание это сила
df = df[df < 2].groupby('ФИО').apply(combine_routes)
Отредактировано lenassakh (Дек. 17, 2022 13:48:13)
Офлайн
я в вашу задачу если чесно особо не лезу просто нет времини (у меня сейчас куча заданий) если вам помогло ок итс гуд
… ну ок если там есть пераменая с часами или днями то наверное стоит это использовать ну или как то адаптировать под ваши задачи
… еще раз я пишу это без погружения в вашу задачу так … общие моменты (ну и по пандас у меня очьнь поверхносные знания у вас наверное и то больше)
Офлайн
AD0DE412Как я понимаю, тоже кучу задач, здорово, что у Вас получается помогать.
я в вашу задачу если чесно особо не лезу просто нет времини (у меня сейчас куча заданий) если вам помогло ок итс гуд… ну ок если там есть пераменая с часами или днями то наверное стоит это использовать ну или как то адаптировать под ваши задачи… еще раз я пишу это без погружения в вашу задачу так … общие моменты (ну и по пандас у меня очьнь поверхносные знания у вас наверное и то больше)
df.groupby(['ФИО', pd.Grouper(key='Дата', freq='2D')]).apply(combine_routes)
Офлайн