python-3.x - 按 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)
希望有人能帮忙!
解决方案
有很多方法可以做到这一点。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
推荐阅读
- netlogo - Netlogo 簇计数大小:堆栈溢出(递归太深)
- python - 如何在python中获取锯齿状数组的长度
- go - Go 语言 - 在重定向输出导致 EOF 后打开到命令 exec 的管道
- javascript - 在 cytoscape.js 中通过 cy.add() 添加多个边后使用 mapData()
- kubernetes - Kubernetes 中 Pod 的 IP 地址
- tensorflow - 使用 feed_dict 比使用数据集 API 快 5 倍以上?
- java - 使用运行 eclipse 的 Desktop.open 打开一个 pdf 文件
- drag-and-drop - 如何使用 AgGrid 自定义重影文本(拖动项目名称)
- react-native - 创建新项目时出错
- android - 在父活动中使用 startActivityForResult() 时,如何获得通过多个活动传递的额外信息?