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