python - Pandas 中的自定义聚合表达式
问题描述
我正在尝试进行自定义聚合(以及其他几个标准聚合)。
像这样的东西:
df = pd.DataFrame(
[["red", 1, 10], ["red", 2, 20], ["green", 5, 15]],
columns=["color", "x", "y"]
)
df2 = (
df
.groupby(["color"])
.agg(amt1=("x", "sum"),
amt2=("x", "mean"),
amt3=("y", "sum"),
# this does not work...
amt4= (0.9 * (x.sum() - y.mean()) / x.max()) + 1
)
)
df2
谢谢你的帮助。
解决方案
我不认为可以直接在自定义函数中使用两列 with agg
,这里有两种选择。要么apply
用于这个特定的自定义函数和concat
其他函数agg
,要么使用基于索引的选择。
# option 1
gr = df.groupby(["color"])
df2 = pd.concat([gr.agg(amt1=("x", "sum"), amt2=("x", "mean"), amt3=("y", "sum")),
gr.apply(lambda dfg: (0.9 * (dfg.x.sum() - df.y.mean())
/ dfg.x.max()) + 1)
.rename('amt4')],
axis=1 )
# option 2
df2 = (df.groupby(["color"])
.aggregate(amt1=("x", "sum"), amt2=("x", "mean"), amt3=("y", "sum"),
amt4= ('x', lambda x: (0.9 * (x.sum() - df.loc[x.index, 'y'].mean())
/ x.max()) + 1))
)
只要索引在 df 中是唯一的,两者都会给出相同的结果
在新版本中使用选项 2 需要常规功能错误描述
def named_lambda(x):
return (0.9 * (x.sum() - df.loc[x.index, 'y'].mean()) / x.max()) + 1
df2 = (df.groupby(["color"])
.aggregate(amt1=("x", "sum"), amt2=("x", "mean"), amt3=("y", "sum"),
amt4= ('x', named_lambda))
)
推荐阅读
- python - 在 PySpark StructStream 中,如何查找组中的每一行与上一行之间的时间差
- reactjs - 自动完成 - MaterialUI - 受控组件不起作用
- c - 如何解决 C 中的 gets() 函数的问题?
- javascript - 如何使用 ReactJS 钩子设置输入值?
- c++ - 调用者和被调用者中数组元素的值不同
- sas - 为唯一记录设计新的 RK 编号
- vue.js - Vuex Computed 属性中的错误已分配给但它没有设置器
- java - Eclipse 文件夹中的圆形取消标志是什么意思?
- javascript - 如何从一个包含对象的大数组中获取两个单独的数组?
- oracle-apex - Oracle Apex 主页 URL 问题 - 固定页面不是动态的