<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【Python】Pandas技巧:groupby+agg/transform

          共 3671字,需瀏覽 8分鐘

           ·

          2022-11-01 12:34

          公眾號:尤而小屋
          作者:Peter
          編輯:Peter

          本文介紹的是分組groupby分組之后如何使用agg和transform

          模擬數(shù)據(jù)

          import pandas as pd
          import numpy as np
          employees = ["小明","小周","小孫","小王","小張"]   # 5位員工
          time = ["上半年""下半年"]


          df=pd.DataFrame({
              "employees":np.random.choice(employees,10),  # 在員工中重復(fù)選擇10次
              # 另一種寫法
              #"employees":[employees[x] for x in np.random.randint(0,len(employees),10)],  
              "time":np.random.choice(time,10),
              "salary":np.random.randint(800,1000,10),  # 800-1000之間的薪資選擇10個(gè)數(shù)值
              "score":np.random.randint(6,12,10)  # 6-11的分?jǐn)?shù)選擇10個(gè)
          })

          df

          employeestimesalaryscore
          0小周上半年87311
          1小王下半年81810
          2小王下半年8046
          3小張下半年8117
          4小張上半年95510
          5小張上半年97511
          6小明上半年8589
          7小明上半年99311
          8小王上半年8418
          9小王下半年9677

          groupby+單個(gè)字段+單個(gè)聚合

          求解每個(gè)人的總薪資金額:

          total_salary = df.groupby("employees")["salary"].sum().reset_index()
          total_salary

          employeessalary
          0小周873
          1小張2741
          2小明1851
          3小王3430

          使用agg也能夠?qū)崿F(xiàn)上面的效果:

          df.groupby("employees").agg({"salary":"sum"}).reset_index()

          employeessalary
          0小周873
          1小張2741
          2小明1851
          3小王3430
          df.groupby("employees").agg({"salary":np.sum}).reset_index()

          employeessalary
          0小周873
          1小張2741
          2小明1851
          3小王3430

          groupby+單個(gè)字段+多個(gè)聚合

          求解每個(gè)人的總薪資金額和薪資的平均數(shù)

          方法1:使用groupby+merge

          mean_salary = df.groupby("employees")["salary"].mean().reset_index()
          mean_salary

          employeessalary
          0小周873.000000
          1小張913.666667
          2小明925.500000
          3小王857.500000

          然后將上面的兩個(gè)結(jié)果進(jìn)行組合;在合并之前為了字段的名字更加的直觀,我們重命名下:

          total_salary.rename(columns={"employees":"total_salary"})
          mean_salary.columns = ["employees","mean_salary"]
          total_mean = total_salary.merge(mean_salary)
          total_mean

          employeessalarymean_salary
          0小周873873.000000
          1小張2741913.666667
          2小明1851925.500000
          3小王3430857.500000

          方法2:使用groupby+agg

          total_mean = df.groupby("employees")\
                      .agg(total_salary=("salary""sum"), 
                           mean_salary=("salary""mean"))\
                      .reset_index()
          total_mean

          employeestotal_salarymean_salary
          0小周873873.000000
          1小張2741913.666667
          2小明1851925.500000
          3小王3430857.500000

          groupby+多個(gè)字段+單個(gè)聚合

          針對多個(gè)字段的同時(shí)聚合:

          df.groupby(["employees","time"])["salary"].sum().reset_index()

          employeestimesalary
          0小周上半年873
          1小張上半年1930
          2小張下半年811
          3小明上半年1851
          4小王上半年841
          5小王下半年2589
          # 使用agg來實(shí)現(xiàn)

          df.groupby(["employees","time"]).agg({"salary":"sum"}).reset_index()

          employeestimesalary
          0小周上半年873
          1小張上半年1930
          2小張下半年811
          3小明上半年1851
          4小王上半年841
          5小王下半年2589

          groupby+多個(gè)字段+多個(gè)聚合

          使用的方法是:

          agg(’新列名‘=(’原列名‘, ’統(tǒng)計(jì)函數(shù)/方法‘))
          df.groupby(["employees","time"])\
                      .agg(total_salary=("salary""sum"), 
                          mean_salary=("salary""mean"),
                          total_score=("score""sum"
                          )\
                      .reset_index()

          employeestimetotal_salarymean_salarytotal_score
          0小周上半年873873.011
          1小張上半年1930965.021
          2小張下半年811811.07
          3小明上半年1851925.520
          4小王上半年841841.08
          5小王下半年2589863.023

          groupby+transform

          關(guān)于transform函數(shù)的使用請參考(建議一定要看):Pandas高階函數(shù)transform使用機(jī)制

          Pandas高級函數(shù)transform使用指南

          一張關(guān)于transform函數(shù)的備忘錄:


          往期精彩回顧




          瀏覽 55
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码天天干 | 成人18禁免费精品网站 | 午夜视频网 | 91在线精品一区二区 | 一级黄色毛片 |