groupby,过滤,在python中汇总?

时间:2019-02-19 18:14:47

标签: python pandas

我在尝试使用python的agg函数时遇到了困难-据我了解,该函数类似于R的summary函数

我有以下数据集:

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'

我认为这是因为“价格” *“费用率”。

谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

这不是一个班轮,但假设我了解您的任务,它将得到结果:

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

也请查看mul页面。