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