Pandas SUMIFS из таблицы 2, для столбца в таблице 1

#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. момент, увидим