我在尝试使用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'
我认为这是因为“价格” *“费用率”。
谢谢!
答案 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
页面。