Python: сгруппировать два столбца вместе и найти сумму третьего столбца - PullRequest
1 голос
/ 21 апреля 2019

Действительно новичок в python и мне нужно немного помочь с вопросом, который я должен завершить.

Мне нужно найти среднее заработанное за период времени (месяц / год), основываясь на вводимых пользователем данных за месяц(ММ) и год (ГГГГ).

У меня есть следующие данные:

year_value = int(input("Year (YYYY): "))
month_value = int(input("Month (MM): "))

Мой фрейм данных выглядит так:

Race_Course   Horse Name      Year   Month   Day   Amount_won_lost   Won/Lost
Aintree       Red Rum         2017   5       12    11.58             won
Punchestown   Camelot         2016   12      22    122.52            won
Sandown       Beef of Salmon  2016   11      17    20.0              lost
Ayr           Corbiere        2016   11      3     25.0              lost
Fairyhouse    Red Rum         2016   12      2     65.75             won
Ayr           Camelot         2017   3       11    12.05             won
Aintree       Hurricane Fly   2017   5       12    11.58             won
Punchestown   Beef or Salmon  2016   12      22    112.52            won
Sandown       Aldaniti        2016   11      17    10.0              lost
etc.

У меня две проблемы:

  1. как группировать данные на основе входных данных и суммировать совпадающие значения Amount_won_lost, а
  2. как убедиться, что при суммировании значений вместе значениев Amount_won_lost отрицателен, когда выиграл / проиграл = проиграл, и остается положительным, когда выиграл / проиграл = выиграл

Любая помощь будет очень признательна!Я застрял на этом в течение нескольких часов и, похоже, не могу понять.

Вывод должен выглядеть примерно так, но все, что печатает результат, было бы идеально, я не противкак это выглядит:

Year    Month    Amount_won_lost
2016    11       €-55.00

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Вы можете сначала изменить знаки вашего атрибута Amount_won_lost, используя pd.DataFrame.apply()

Так для следующей строки:

df["Amount_won_lost"] = df.apply(lambda x: -x["Amount_won_lost"] \
    if x["Won/Lost"] == "lost" else x["Amount_won_lost"], axis = 1)

Он заменит ваш столбец Amount_won_lost либоположительное или отрицательное значение в зависимости от того, выиграли они или проиграли.

И, используя функцию sum(), упомянутую в других комментариях, вы можете получить сумму для Amount_won_lost для данного года и месяца.

Следующее выберет все значения при введенных вами значениях:

df[(df["Year"] == year_value) & (df["Month"] == month_value)]

Вывод будет следующим:

  Race_Course       HorseName  Year  Month  Day  Amount_won_lost Won/Lost
2     Sandown  Beef of Salmon  2016     11   17            -20.0     lost
3         Ayr        Corbiere  2016     11    3            -25.0     lost
8     Sandown        Aldaniti  2016     11   17            -10.0     lost

print(df[(df["Year"] == year_value) & (df["Month"] == month_value)]["Amount_won_lost"].sum())

напечатает -55.0.

Если вы хотели видеть суммы за каждый данный месяц в году, без использования пользовательских данных, функция groupby - ваш лучший выбор!

0 голосов
/ 21 апреля 2019

, пожалуйста, попробуйте это

by_year = race_data[race_data['Year']==year_value ]
by_month = by_year[by_year['Month']==year_value ]
print(by_month['Amount_won_lost'].sum())

я надеюсь, что это поможет

ps: данные являются пандами DataFrame

...