Python:将两列组合在一起,找到第三列的总和

时间:2019-04-21 19:57:48

标签: python input group-by sum

对于python来说确实是新手,需要我完成一个问题需要一些帮助。

我需要根据用户对月份(MM)和年份(YYYY)的输入来找到每个时间段(月/年)的平均收入。

我的输入如下:

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. 如何确保在对值进行求和时,当Won / Lost =丢失时Amount_won_lost中的值为负,而当Won / Lost = won时保持为正值

任何帮助将不胜感激!我已经坚持了几个小时,似乎无法弄清楚。

输出应该看起来像这样,但是任何可以打印结果的东西都是完美的,我不在乎它的外观:

Year    Month    Amount_won_lost
2016    11       €-55.00

2 个答案:

答案 0 :(得分:0)

请尝试

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:数据是熊猫数据框

答案 1 :(得分:0)

您可以先使用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功能是您最好的选择!