【问题标题】:groupby, filter, summarise in python?groupby,过滤器,在python中总结?
【发布时间】:2022-03-16 19:10:53
【问题描述】:

我在尝试使用 python 的 agg 函数时遇到了困难——据我所知——它类似于 R 的 summarise 函数

我有以下数据集:

ID   Date     Qtr    Price    Fee_Rate
 1   1/1/10    1      10        1.002 
 1   1/2/10    1      10.3      1.002 
 1   1/3/10    1      10.4      1.002
 2   1/1/10    1      25        .987
 2   1/2/10    1      23.4      .987
...    ...    ...     ...       ...
 1   4/1/10    2       12.4      1.09
 1   4/2/10    2       12.5      1.09

等等..

基本上 - 我想按季度分组,过滤到季度的第一个日期,并总结 (Price*Fee_Rate)

在 R 中 - 代码如下

 df %>% group_by(Qtr) %>% filter(Date == min(Date) %>% summarise( L_Value = sum(Price*Fee_Rate))

如何在 Python 中复制这种语法?

这是我迄今为止尝试过的:

df.groupby('Qtr').head(1).agg({'L_Value' : ('Price'*'Fee_Rate').sum())}) 

但它不起作用,出现以下错误:

can't multiply sequence by non-int of type 'str'

我认为这是因为 'Price' * 'Fee_Rate'..

谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

我的测试数据集:

s = """ID   Date     Qtr    Price    Fee_Rate
 1   1/1/10    1      10        1.002 
 1   1/2/10    1      10.3      1.002 
 1   1/3/10    1      10.4      1.002
 2   1/1/10    1      25        .987
 2   1/2/10    1      23.4      .987
 1   4/1/10    2       12.4      1.09
 1   4/2/10    2       12.5      1.09"""

# Read df from string
df = pd.read_csv(pd.compat.StringIO(s), sep="\s+")

首先将Date列转换为日期时间格式:

df["Date"] = pd.to_datetime(df["Date"])

请求的计算:

# Min date per Qtr
min_dt = df.groupby("Qtr")["Date"].transform(min)

# Compare each date with min dates
only_first_dates = df[df["Date"] == min_dt].copy()

# Calculate new column
only_first_dates["new_col"] = only_first_dates.eval("Price * Fee_Rate")

# Groupby and sum
only_first_dates.groupby("Qtr")["new_col"].sum()

【讨论】:

  • 这仅适用于每季度第一个日期的 1 个 ID,我希望它包含第一个日期的所有 ID @koPytok
  • @yungpadewon 已编辑
【解决方案2】:

这不是一个单一的班轮,但假设我理解你的任务,它会得到结果:

df_grouped = df.groupby('Qtr').head(1)
df_grouped['L_value'] = df_grouped['Price'].mul(df_grouped['Fee_Rate'])

也请查看mul 页面。

【讨论】:

  • 不会 df_grouped = df.groupby('Qtr').head(1) 只为第一个日期存储 1 个 ID。如果我想要第一个日期的所有 ID 怎么办? @Alex L
【解决方案3】:

我知道这是三年前的事了,但我也想知道答案,我已经在下面进行了测试,似乎可行

df[(df['ColumnToFilterOn'] == filterValue)].groupby('ColumnToGroupBy').sum()

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2015-02-13
    • 2022-01-23
    相关资源
    最近更新 更多