pandas
的 groupby
是一個強大且常用的功能哑舒,用于對數(shù)據(jù)進行分組并應(yīng)用各種操作。以下是一些 groupby
的常見用法和示例:
1. 基本用法 -- 單列分組
groupby
通常與聚合函數(shù)(如 sum
淤袜、mean
、count
等)一起使用愉烙。以下是一些常見的 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. 多列分組
可以按多列進行分組,例如按 Date
和 ProductID
分組:
# 按 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=False
與 reset_index()
的異同
as_index=False
和 reset_index()
在某些情況下確實可以達到相同的效果,但它們的使用場景和細節(jié)有一些區(qū)別端逼。
在 groupby
時直接指定 as_index=False
可以避免生成索引朗兵,而是將分組鍵作為普通列保留在結(jié)果中。
如果已經(jīng)進行了 groupby
且沒有使用 as_index=False
顶滩,可以使用 reset_index()
將索引轉(zhuǎn)換為列余掖。
區(qū)別:
-
操作時機:
as_index=False
是在groupby
操作時就指定不使用索引,而reset_index()
是在groupby
操作完成后再將索引轉(zhuǎn)換為列礁鲁。 -
代碼簡潔性:如果你知道你不需要分組鍵作為索引盐欺,使用
as_index=False
會更簡潔,因為它在一個步驟中完成了操作仅醇。而使用reset_index()
則需要多一個步驟冗美。