#python #pandas #dataframe #sumifs
#python #pandas #фрейм данных #sumifs
Вопрос:
У меня большой df с тарифами для авиационных линий. вы можете указать данные для конкретного маршрута, например, по аэропорту отправления, аэропорту назначения, самолету, месяцу. Простой пример df:
data = {'orig':['A','A','A','B','B','B'],
'dest':['C','C','C','D','D','D'],
'currency':['RUB','USD','RUB','USD','RUB','USD'],
'tarif':[100,10,120,20,150,30]}
df=pd.DataFrame(data)
df
orig dest currency tarif
0 A C RUB 100
1 A C USD 10
2 A C RUB 120
3 B D USD 20
4 B D RUB 150
5 B D USD 30
У меня есть df2, который содержит авиационный план для конкретной компании. Там вы можете найти ту же информацию, например, месяц, начало, дата, самолет
Простой пример df2:
data2={'orig':['A','B'],
'dest':['C','D']}
df2=pd.DataFrame(data2)
df2
orig dest
0 A C
1 B D
Задача: для каждой строки в df2 суммируйте тариф, используя условия.
Чего я ожидаю:
orig dest RUB USD
0 A C 220 10
1 B D 150 50
Спасибо.
Комментарии:
1. Это звучит как классика
gruopby/agg
. Ofc нельзя попробовать на изображениях. Было бы неплохо, если бы вы предоставили ввод обычного текста и желаемый результат.2. Готово, надеюсь, это то, что вы имели в виду
3. Однако у меня есть два вопроса. В df1 есть две строки с рейсами из B в D с трафиком в долларах США. Вы действительно хотите сложить? Не похоже на минимум или что-то в этом роде? И что вы хотите сделать с материалом, для которого нет строки в df2? Просто отбросить их? Возможно, вам следует добавить это в свой пример, чтобы поведение было понятным.
4. Q1: Для лучшего понимания представьте, что у вас есть линия Нью-Йорк-Берлин. Во время вашей поездки я буду летать над разными странами, эти страны взимают плату за навигационное обслуживание, у каждой страны свой тариф и валюта. Вот почему для одной строки B-D у вас может быть несколько строк с разными тарифами в долларах США. В конечном счете, общая стоимость, которую вы имеете, будет суммой.
5. Q2: В случае, если данных нет, просто 0. Зависит от строки, если у вас есть рейс в пределах границ страны, после фильтрации origin, dest, aircraft, month, вы получите несколько строк, например, в долларах США. Поэтому eur, rur будут равны 0. В другом случае у вас международный рейс, и это подразумевает полет над Германией и Россией. После фильтрации вы получите строки с RUR и EUR, так что это будет только usd = 0.
Ответ №1:
Хммм
df = df.groupby(["orig", "dest", "currency"]).agg(sum).unstack()
df.columns = ['_'.join(col).strip() for col in df.columns.values]
df
дает мне
tarif_RUB tarif_USD
orig dest
A C 220 10
B D 150 50
Какой ваш желаемый результат, но я еще не смотрел на df2, поэтому, боюсь, вам нужно лучше описать / расширить свой пример, поэтому я должен что-то сделать с df2.
Комментарии:
1. О, я понимаю. Дело в том, что df1 (навигационные тарифы) имеет почти 1 миллион строк, есть все маршруты, которые существуют сегодня. Конечно, нет компании, которая делает все строки, поэтому у нее 100-150 уникальных строк за год. Это упражнение больше похоже на Excel. У вас есть свой план маршрута (где 150 уникальных строк, разделенных по AC, месяцам и т. Д.). Теперь вам нужно просмотреть свой план маршрута (df2) и получить из df1 (navi tarifs) суммы в соответствии с происхождением, назначением, переменным током, месяцем.
2. Итак, мы смотрим на первую строку в df2, например, в ней есть origin — A, dest-B, AC-777, Month-1. затем он принимает эти параметры, фильтрует df1 (navi tarifs) в соответствии с входными данными, затем суммирует rur eur usd в отдельных столбцах.
3. @Tabue можете ли вы изменить свой пример и вывод примера, чтобы я получал правильный вывод, только если я поступаю правильно?
4. момент, увидим