pandas - pandas GroupBy agg 计算(传递参数)
问题描述
我想使用 pandas GroupBy agg“计算/描述性统计”函数,而不是应用定义/自定义或 lambda 函数。我发现前一种方法(例如df.groupby(groupid).agg({'col1':'mean'})
)比后来的方法(例如 )更快df.groupby(groupid).agg(name='col1',lambda x:np.nanmean(x))
。但是,我很难根据需要在多个列上应用前一种方法。
假设我有这样的 pandas 数据框,我想采用(只是示例)
- 每个用户的交易数量
- 交易的第二个最后日期
- 平均交易额
df = pd.DataFrame({"user_id":["u123"] * 5,
"order_date":["2021-01-01","2021-01-02","2021-01-03","2021-01-04","2021-01-04"],
"item_price":[123,234,321,345,0]})
我可以在 groupby.agg 中使用 lambda 函数,例如,
df.groupby('user_id').agg(count=('user_id', lambda x: len(x)),
last2date=('order_date', lambda x: x.tail(2)[-1:]),
avgprice=('item_price', lambda x: np.nanmean(x))).reset_index()
但是,我不想使用 lambda 函数,而是想使用tail
ornth
函数,但不知道如何通过n
.
df.groupby(['user_id'])['order_date'].tail(2)[-1:] ## this works but I want agg on other columns too
df.groupby(['user_id']).agg({'user_id':'size', 'order_date':'nth'}) ## this fails how to pass n?
- 我搜索了很多资源,但找不到解决这种特殊情况的方法。
解决方案
推荐阅读
- postgresql - Postgres 不会为唯一键约束重用唯一索引吗?
- node.js - create-react-app eslint 问题,因为更高级别的文件夹包含另一个应用程序,其中包含 node_modules
- r - 按日期序列为每个 id 生成行
- python - Python - 从未通过 __init__.py 导入的包中访问模块?
- javascript - Js 只识别 if 中数组的前 2 个元素
- google-apps-script - 将自动对我的一张工作表进行排序的代码
- python - 如何将默认语言模式换成我的
- javascript - 操作对象属性和重新分配的简写
- angular - 自定义指令并覆盖另一个指令
- pyspark - Pyspark 和 Jupyter:不支持的 major.minor 版本 52.0