Pandas分组小计

2024-09-30 04:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个包含时间序列的数据帧,比如:

NAME, DATE, VACATION (True/False)
Eric, 1/1/12, False
Eric, 1/2/12, True
...
Bob, 4/2/12, True
Bob, 4/3/12, False

基本上,我需要的是一个dict或者一些我可以用Jinja2格式模板的东西

^{pr2}$

基本上,我需要得到每个用户每年休假的小计,细分为每年、每周、每季度。。。。。在

有没有一种快速的方法可以把它转换成dict,这样我就可以用Jinja2来模板了?在

我知道我可以做groupby等。。。。但是,我只能把每季度、每年、每周做什么都当作不同的groupby,然后重新组合成dict

有没有一种方法可以同时做到这些?在

目前我正在做以下工作。。。在

perweek = df.groupby(['name', 'date'].count.resample('W').count
for i in perweek.iter
  add to dict

perquarter = df.groupby(['name', 'date']).count.resample.count
for i in perquarter.iter
  add to dict

peryear ... etc

基本上我分组,然后计数,然后重新取样。。然后重复这些并将它们添加到dict中。对我想要的每个重采样都做同样的事情。它起作用了。。。我只是想知道有没有一种方法可以不使用多个迭代器。在


Tags: 方法name模板falsetruejinja2dfdate
1条回答
网友
1楼 · 发布于 2024-09-30 04:33:53

我有一个复杂的解决方案。在

def get_vacation_info(x):
    vacations = sorted(x["DATE"][x["VACATION"]=="True"].tolist())
    df_x = pd.DataFrame(vacations, columns=["DATE"]).apply(pd.to_datetime)
    df_x["year"] = df_x.DATE.dt.year
    df_x["week"] = df_x.DATE.dt.weekofyear
    df_x["quarter"] = df_x.DATE.dt.quarter

    def get_subtotals(y):
        total = len(y)
        perweek = y["week"].value_counts().reset_index()
        weekindex = pd.DataFrame([i for i in range(1, 53)], columns=["index"])
        merged_week = pd.merge(weekindex, perweek, on=["index"], how="left").fillna(0).astype(int)
        perweek = merged_week["week"].tolist()

        perquarter = y["quarter"].value_counts().reset_index()
        quarterindex = pd.DataFrame([i for i in range(1, 5)], columns=["index"])
        merged_quater = pd.merge(quarterindex, perquarter, on=["index"], how="left").fillna(0).astype(int)
        perquarter = merged_quater["quarter"].tolist()
        return {"total": total, "perweek": perweek, "perquarter": perquarter}

    subtotals = df_x.groupby("year").apply(lambda y: get_subtotals(y)).to_json()

    return {"vacations": vacations, "subtotals": subtotals}  

result = df.groupby("NAME").apply(lambda x: get_vacation_info(x))

相关问题 更多 >

    热门问题