import pandas as pddf = pd.DataFrame({ "x": ['a', 'b', 'a', 'a', 'b'], "y": [1, 2, 3, 2, 1], "z": [3, 1, 5, 1, 7],})# transform依旧依赖于groupbyprint(df.groupby(by=["x"], as_index=False).agg("sum"))""" x y z0 a 6 91 b 3 8"""print(df.groupby(by=["x"], as_index=False).transform("sum"))""" y z0 6 91 3 82 6 93 6 94 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 ya 2b 1a 3agg("sum"): x y a 5 b 1transform("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"))""" y0 61 32 63 64 3"""# 并且如果我们使用transform之后还需要by后面指定的列、这里是"x",那么直接手动添加即可,因为顺序是不变的,假设transform之后的结果赋值给变量trans,那么直接通过trans["x"] = df["x"]就行了。# 到此结束了,可以看到transform的操作就没有agg那么丰富了