Python自定义聚合函数merge与transform区别详解
介绍
在Pandas中,我们经常需要对数据进行聚合操作,如求和、计数等。Pandas提供了多种内置的聚合函数(如mean、sum等),同时也支持自定义聚合函数。自定义聚合函数可以满足更灵活的需求,但由于其实现方式与内置聚合函数有所不同,容易引起一定的困惑。本篇文章将重点介绍自定义聚合函数中的merge和transform两个方法的区别。
方法一:merge函数
merge函数主要用于实现一些复杂的聚合操作。它的本质是将原始数据(即分组对象)按照指定的方式合并为一个新的数据表,再对新数据表进行聚合操作。merge函数的常见参数如下:
- how:合并方式。默认为“inner”。
- on:合并的字段。
- left_on、right_on:用于连接的左、右侧的字段。
- suffixes:左右侧合并后的字段后缀,默认为["_x", "_y"]。
下面给出一个示例,作用为对“人口普查”数据进行聚合操作,得到每个省份和城市的总人口数。
import pandas as pd
# 创建数据
data = pd.DataFrame({
"省份": ["北京市", "北京市", "天津市", "天津市"],
"城市": ["东城区", "西城区", "和平区", "河东区"],
"人口数": [1000, 2000, 3000, 4000]
})
# 分组求和
grouped_data = data.groupby(["省份", "城市"]).sum()
# 使用merge函数
merge_data = pd.merge(grouped_data.reset_index(level=[1]),
grouped_data.reset_index(level=[0]),
on="省份")
print(merge_data)
输出结果如下:
省份 人口数_x 人口数_y
城市
东城区 北京市 1000 3000
西城区 北京市 2000 3000
和平区 天津市 3000 7000
河东区 天津市 4000 7000
方法二:transform函数
transform函数是一种对数据进行“原地”变换的方法,即不改变数据的形状,仅对其中的数值进行变化。这种方法非常适合用于对数据进行归一化、标准化等操作。transform函数的常见参数如下:
- func:自定义函数,用于对数据进行变换。
- axis:变换轴,取值为0或1,默认为0。
- inplace:是否在原对象上进行变换,默认为False。
下面给出一个示例,作用为对“人口普查”数据进行聚合操作,得到每个省份和城市的人口占比。
import pandas as pd
# 创建数据
data = pd.DataFrame({
"省份": ["北京市", "北京市", "天津市", "天津市"],
"城市": ["东城区", "西城区", "和平区", "河东区"],
"人口数": [1000, 2000, 3000, 4000]
})
# 分组求和
grouped_data = data.groupby(["省份", "城市"]).sum()
# 自定义函数
def population_ratio(x):
return x / x.sum()
# 使用transform函数
transform_data = grouped_data.groupby(level=[0]).transform(population_ratio)
print(transform_data)
输出结果如下:
人口数
省份
北京市 东城区 0.333333
西城区 0.666667
天津市 和平区 0.428571
河东区 0.571429
总结
merge函数用于对原始数据进行合并和变换,得到新的数据表进行聚合操作;而transform函数则是在对数据进行聚合操作之后,对每个组内的数值进行变换。两种方法各有自己的适用场景,需要根据具体情况选择使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python自定义聚合函数merge与transform区别详解 - Python技术站