本文介绍了如何使用不同的聚合函数高效聚合同一列?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
考虑以下数据:
df = pd.DataFrame({"id": [1, 1, 1, 2, 2], "value": [10, 50, 90, 25, 75]})
df
id value
0 1 10
1 1 50
2 1 90
3 2 25
4 2 75
如何通过id高效优雅地聚合列值考虑同一列上的多个聚合函数,例如:
value_min value_max value_mean value_sum value_max_diff
id
1 10 90 50 150 80
2 25 75 50 100 50
一种方法是创建多个透视表,每个聚合函数(内置或非内置)创建一个透视表,然后连接结果,例如:
def max_diff(x):
return np.max(x) - np.min(x)
funcs = [np.min, np.max, np.mean, np.sum, max_diff]
tmp = [pd.pivot_table(df, index=["id"], values=["value"],
aggfunc={"value": f}).rename(columns={"value": f"value_{f.__name__}"}) for f in funcs]
pivot = pd.concat(tmp, axis=1)
pivot
value_amin value_amax value_mean value_sum value_max_diff
id
1 10 90 50 150 80
2 25 75 50 100 50
但是,在我看来,考虑到多个列和每个列有多个甚至不同的聚合函数,这种方法的伸缩性不是很好。正如雷蒙德·赫廷格所说:肯定有更好的办法!那么,哪一个更好?
提前谢谢!
推荐答案
可以使用pandas.DataFrame.groupby
和DataFrameGroupBy.aggregate
:
df.groupby("id").agg(funcs)
# value
# amin amax mean sum max_diff
#id
#1 10 90 50 150 80
#2 25 75 50 100 50
多列不同功能解决方案:
df = pd.DataFrame({"id": [1, 1, 1, 2, 2], "value1": [10, 50, 90, 25, 75], "value2": [1, 5, 6, 3, 8]})
# id value1 value2
#0 1 10 1
#1 1 50 5
#2 1 90 6
#3 2 25 3
#4 2 75 8
funcs = {"value1": [np.min, np.max], "value2": [np.mean, np.sum, max_diff]}
df.groupby("id").agg(funcs)
# value1 value2
# amin amax mean sum max_diff
#id
#1 10 90 4.0 12 5
#2 25 75 5.5 11 5
这篇关于如何使用不同的聚合函数高效聚合同一列?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!