Python 3.x 按id对数据帧分组后执行操作

Python 3.x 按id对数据帧分组后执行操作,python-3.x,pandas,pandas-groupby,Python 3.x,Pandas,Pandas Groupby,我的当前数据帧: 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就有一行,如下所示: df_new= [id,total_days,total

我的当前数据帧:

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就有一行,如下所示:

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

天=每个id的最大日期mindate。 日期包括在内,因此2018年1月8日-2018年1月6日=3。此外,如果只为用户提供了1个日期或会话,则只需填写1即可

会话=每个id的maxsession_rank-minsession_rank

销售=每个id的销售总额


希望有人能帮忙

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

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
df.groupby'id'.agg{
“session_rank”:lambda x:x,如果lenxIt是相似的!……某种程度上。我不同意OP根据他们的要求得出的预期结果。如果max=6,min=5,Id 1应该是session_rank=1