首页 > 解决方案 > 按 id 分组数据帧后执行操作

问题描述

我当前的数据框:

df=
[id,date,       session_rank,sales]
[1, 06-01-2018, 5,             10 ]
[1, 08-01-2018, 6,             30 ]
[2, 06-01-2018, 1,              0 ]
[3, 05-01-2018, 3,             30 ]

我希望按 聚合id,因此我最终以id以下方式得到 1 行:

df_new=
[id,total_days,total_sessions,total_sales]
[1,  3,         2,             40        ]
[2,  1,         1,             0         ]
[3,  1,         3,             30        ]

计算:

每个 id 的 days=max(date)-min(date)。包括日期在内,因此 08-01-2018 - 06-01-2018 = 3。此外,如果只为用户提供 1 个日期或会话,则只需填写 1。

每个 id 的 session=max(session_rank)-min(session_rank)

每个 id 的 sales=sum(sales)

希望有人能帮忙!

标签: python-3.xpandaspandas-groupby

解决方案


有很多方法可以做到这一点。M 的想法是按日期分组,然后执行自定义 agg。注意:我正在重建您的 df,并在 date 上使用转换器来获取 datetime dtype。

import pandas as pd
import io

s = '''id  date  session_rank  sales
       1  06-01-2018  5             10 
       1  08-01-2018  6             30 
       2  06-01-2018  1              0 
       3  05-01-2018  3             30'''

df = pd.read_csv(io.StringIO(s), sep='\s+', converters={'date': lambda x: pd.to_datetime(x, format='%d-%m-%Y')})
df = df.groupby('id').agg({'date': lambda x: ((x.max()-x.min()) + '1D').days,
                           'session_rank': lambda x: x if len(x)<2 else x.max()-x.min(),
                           'sales': sum})

print(df)

    date  session_rank  sales
id                           
1      3             1     40
2      1             1      0
3      1             3     30

推荐阅读