import pandas as pd
df = pd.DataFrame({
"x": ['a', 'b', 'a', 'a', 'b'],
"y": [1, 2, 3, 2, 1],
"z": [3, 1, 5, 1, 7],
})
# transform依旧依赖于groupby
print(df.groupby(by=["x"], as_index=False).agg("sum"))
"""
x y z
0 a 6 9
1 b 3 8
"""
print(df.groupby(by=["x"], as_index=False).transform("sum"))
"""
y z
0 6 9
1 3 8
2 6 9
3 6 9
4 3 8
"""
# 我们看到如果是groupby后面直接通过agg进行聚合的话,那么行的数量会变少,因为聚合了嘛。而且by指定的列就不会有重复了
# 但如果是通过transform的话,那么行是不会减少的,原来是多少行结果还是多少行,并且自动把by指定的列给去掉了。
# 可以这么理解,我们用普通的聚合作为比喻:
"""
如果是agg("sum")的话,by="x"这一列只有a和b,说明原来的"x"这个列只有a和b两种数据。可能数量很多,但种类只有a和b两种
聚合之后,a对应y中的6,对应z中的9
那么transform("sum")就相当于把原来x列中所有元素为a的,对应的y中的元素全部换成6,对应的z中的元素全部换成9
聚合之后,b对应y中的3,对应z中的8
那么transform("sum")就相当于把原来x列中所有元素为b的,对应的y中的元素全部换成3,对应的z中的元素全部换成8
可能逻辑有点不好说,那么再来举个例子
x y
a 2
b 1
a 3
agg("sum"):
x y
a 5
b 1
transform("sum")
y
5
1
5
因为聚合之后,a对应5,b对应1
那么就把原来a对应的y中的元素全部换成5,b对应的y中元素全部换成1
"""
# 如果想要指定某些列该怎么办呢?显然和刚才介绍的一样
print(df.groupby(by=["x"], as_index=False)[["y"]].transform("sum"))
"""
y
0 6
1 3
2 6
3 6
4 3
"""
# 并且如果我们使用transform之后还需要by后面指定的列、这里是"x",那么直接手动添加即可,因为顺序是不变的,假设transform之后的结果赋值给变量trans,那么直接通过trans["x"] = df["x"]就行了。
# 到此结束了,可以看到transform的操作就没有agg那么丰富了