python pandas庫的groupby函數(shù)用法介紹

pandasgroupby 是一個強大且常用的功能哑舒,用于對數(shù)據(jù)進行分組并應(yīng)用各種操作。以下是一些 groupby 的常見用法和示例:

1. 基本用法 -- 單列分組

groupby 通常與聚合函數(shù)(如 sum淤袜、meancount 等)一起使用愉烙。以下是一些常見的 groupby 用法示例:

import pandas as pd

# 創(chuàng)建示例數(shù)據(jù)
data = {
    'Date': ['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02'],
    'ProductID': [1, 2, 1, 2],
    'Platform': ['A', 'A', 'B', 'B'],
    'Sales': [100, 150, 200, 250],
    'Quantity': [10, 15, 20, 25]
}

df = pd.DataFrame(data)

# 按 Date 分組作喘,并計算每組的總銷售額
grouped = df.groupby('Date').agg({
    'Sales': 'sum',
    'Quantity': 'sum'
})

print(grouped)

輸出結(jié)果:

          Sales  Quantity
Date                     
2021-01-01    250        25
2021-01-02    450        45

2. 多列分組

可以按多列進行分組,例如按 DateProductID 分組:

# 按 Date 和 ProductID 分組霞势,并計算每組的總銷售額
grouped = df.groupby(['Date', 'ProductID']).agg({
    'Sales': 'sum',
    'Quantity': 'sum'
})

print(grouped)

輸出結(jié)果:

                   Sales  Quantity
Date       ProductID                
2021-01-01 1          100        10
           2          150        15
2021-01-02 1          200        20
           2          250        25

3. 使用自定義聚合函數(shù)

你還可以使用自定義的聚合函數(shù),例如計算每組的平均銷售額:

# 按 Date 分組斑鸦,并計算每組的平均銷售額
grouped = df.groupby('Date').agg({
    'Sales': 'mean',
    'Quantity': 'mean'
})

print(grouped)

輸出結(jié)果:

          Sales  Quantity
Date                     
2021-01-01  125.0      12.5
2021-01-02  225.0      22.5

4. 使用 apply 方法

如果需要更靈活的分組操作愕贡,可以使用 apply 方法:

# 按 Date 分組,并對每組應(yīng)用自定義函數(shù)
grouped = df.groupby('Date').apply(lambda x: x['Sales'].sum() - x['Quantity'].sum())

print(grouped)

輸出結(jié)果:

Date
2021-01-01    225
2021-01-02    405
dtype: int64

5. 重置索引

在使用 groupby 進行分組操作后巷屿,索引會變成分組列固以。如果需要恢復原來的索引,可以使用 reset_index 方法:

# 按 Date 分組嘱巾,并計算每組的總銷售額憨琳,然后重置索引
grouped = df.groupby('Date').agg({
    'Sales': 'sum',
    'Quantity': 'sum'
}).reset_index()

print(grouped)

輸出結(jié)果:

        Date  Sales  Quantity
0  2021-01-01    250        25
1  2021-01-02    450        45

6. 把修改反應(yīng)到原始數(shù)據(jù)上

groupby 操作會返回一個新的 DataFrame,不支持 inplace 操作旬昭。

可以將結(jié)果覆蓋原 DataFrame 來達到目的篙螟。

import pandas as pd

# 創(chuàng)建示例數(shù)據(jù)
data = {
    'Date': ['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02'],
    'ProductID': [1, 2, 1, 2],
    'Platform': ['A', 'A', 'B', 'B'],
    'Sales': [100, 150, 200, 250],
    'Quantity': [10, 15, 20, 25]
}

df = pd.DataFrame(data)

print(df)

df = df.groupby('Date').agg({
    'Sales': 'sum',
    'Quantity': 'sum'
}).reset_index()

print(df)

輸出結(jié)果:

         Date  ProductID Platform  Sales  Quantity
0  2021-01-01          1        A    100        10
1  2021-01-01          2        A    150        15
2  2021-01-02          1        B    200        20
3  2021-01-02          2        B    250        25
         Date  Sales  Quantity
0  2021-01-01    250        25
1  2021-01-02    450        45

7. as_index 參數(shù)說明

as_index 參數(shù)用于控制分組鍵是否成為結(jié)果的索引。默認情況下问拘,as_index=True遍略,分組鍵會成為結(jié)果的索引惧所。如果設(shè)置 as_index=False,分組鍵會作為普通列返回绪杏。

as_index=True 時下愈,分組鍵會成為結(jié)果的索引。這樣做的好處是可以利用分組鍵進行快速查詢和選擇蕾久。

as_index=False 時势似,分組鍵會作為普通列返回。這樣做的好處是可以避免索引的額外復雜性僧著,特別是在后續(xù)需要對結(jié)果 DataFrame 進行進一步處理時履因。

# 按 Date 分組,并計算每組的總銷售額
grouped = df.groupby('Date', as_index=False).agg({
   'Sales': 'sum',
   'Quantity': 'sum'
})

print(grouped)

輸出:

         Date  Sales  Quantity
0  2021-01-01    250        25
1  2021-01-02    450        45

選擇 as_index 參數(shù)取決于具體需求霹抛。如果你需要將分組鍵作為列進行操作搓逾,建議設(shè)置 as_index=False;如果你希望利用分組鍵進行索引操作杯拐,使用默認的 as_index=True 即可霞篡。

8. as_index=Falsereset_index()的異同

as_index=Falsereset_index() 在某些情況下確實可以達到相同的效果,但它們的使用場景和細節(jié)有一些區(qū)別端逼。

groupby 時直接指定 as_index=False 可以避免生成索引朗兵,而是將分組鍵作為普通列保留在結(jié)果中。

如果已經(jīng)進行了 groupby 且沒有使用 as_index=False顶滩,可以使用 reset_index() 將索引轉(zhuǎn)換為列余掖。

區(qū)別:

  1. 操作時機as_index=False 是在 groupby 操作時就指定不使用索引,而 reset_index() 是在 groupby 操作完成后再將索引轉(zhuǎn)換為列礁鲁。
  2. 代碼簡潔性:如果你知道你不需要分組鍵作為索引盐欺,使用 as_index=False 會更簡潔,因為它在一個步驟中完成了操作仅醇。而使用 reset_index() 則需要多一個步驟冗美。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市析二,隨后出現(xiàn)的幾起案子粉洼,更是在濱河造成了極大的恐慌,老刑警劉巖叶摄,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属韧,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛤吓,警方通過查閱死者的電腦和手機宵喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会傲,“玉大人樊破,你說我怎么就攤上這事愉棱。” “怎么了哲戚?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵奔滑,是天一觀的道長。 經(jīng)常有香客問我顺少,道長朋其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任脆炎,我火速辦了婚禮梅猿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秒裕。我一直安慰自己袱蚓,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布几蜻。 她就那樣靜靜地躺著喇潘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梭稚。 梳的紋絲不亂的頭發(fā)上颖低,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音弧烤,去河邊找鬼忱屑。 笑死,一個胖子當著我的面吹牛暇昂,可吹牛的內(nèi)容都是我干的莺戒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼急波,長吁一口氣:“原來是場噩夢啊……” “哼脏毯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幔崖,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渣淤,沒想到半個月后赏寇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡价认,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年嗅定,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片用踩。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡渠退,死狀恐怖忙迁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碎乃,我是刑警寧澤姊扔,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站梅誓,受9級特大地震影響恰梢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梗掰,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一嵌言、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧及穗,春花似錦摧茴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至猜惋,卻和暖如春丸氛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背著摔。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工缓窜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谍咆。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓禾锤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摹察。 傳聞我的和親對象是個殘疾皇子恩掷,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容