Pandas是Python中數據分析最重要的工具之一,而GroupBy是Pandas一個非常有用的函數,它具有重要的數據分析和操作功能。本文將會從多個角度解析Pandas GroupBy函數的功能和用法。
一、數據分組
GroupBy函數用於將DataFrame對象中的數據進行分組操作,首先需要先創建一個DataFrame:
import pandas as pd
data = {'name': ['John', 'Sam', 'John', 'Sam', 'Tom'],
'age': [25, 30, 35, 40, 45],
'sex': ['M', 'M', 'M', 'M', 'M'],
'salary': [2000, 2500, 3000, 3500, 4000]}
df = pd.DataFrame(data)
然後,我們就可以通過GroupBy函數將數據按照需要的列進行分組。例如,我們首先按照“name”列對數據進行分組:
grouped = df.groupby('name')
這樣就可以將數據按照名稱分成三個組,分別是“John”、“Sam”和“Tom”。在以上代碼中,GroupBy函數返回了一個DataFrameGroupBy對象,這個對象包含了分組後的數據,我們可以通過apply()、aggregate()、transform()等函數對這些分組後的數據進行操作。
二、使用apply()函數
apply()函數是GroupBy函數中常用的一個函數,它可以對分組後的數據進行自定義的操作。例如,我們可以通過以下代碼對“salary”列求和:
grouped.apply(lambda x: x['salary'].sum())
以上代碼會返回一個Series對象,包含了每個組的“salary”列的和。
此外,apply()函數還可以應用自定義的函數,例如,我們可以定義一個函數來計算每個組的平均工資:
def mean_salary(group):
return group['salary'].mean()
grouped.apply(mean_salary)
以上代碼將會返回一個DataFrame對象,包含了每個組的平均工資。
三、使用aggregate()函數
aggregate()函數可以對分組後的數據進行多個聚合操作,例如求和、均值、方差等。以下代碼可以同時計算每個組的平均年齡和平均工資:
grouped.aggregate({'age': 'mean', 'salary': 'mean'})
以上代碼會返回一個DataFrame對象,包含每個組的平均年齡和平均工資的值。
四、使用transform()函數
transform()函數是GroupBy函數的另一個常用函數,它可以對每個組中的數據進行組內操作,並且將結果返回到原始DataFrame中的相應位置。例如,我們可以將每個組的工資減去平均工資:
grouped.transform(lambda x: x['salary'] - x['salary'].mean())
以上代碼將會返回一個Series對象,包含每個組所有數據的工資減去平均工資的值。
五、使用agg()函數
agg()函數是aggregate()函數的簡化版,它可以對分組後的數據進行多個聚合操作,例如求和、均值、方差等。以下代碼可以同時計算每個組的平均年齡和平均工資:
grouped.agg(['mean', 'std'])
以上代碼將會返回一個DataFrame對象,包含每個組的平均年齡和平均工資的值,以及它們的標準差。
六、使用GroupBy對象獲取分組信息
GroupBy對象包含了分組後的數據,也包含了分組的信息,可以通過以下代碼獲取分組後的所有組名:
grouped.groups.keys()
以上代碼將會返回一個字典對象,包含了所有的組名。
除此之外,GroupBy對象還包含了其它有用的屬性和方法,例如size、indices、get_group等。
七、使用多個鍵進行分組
當需要使用多個鍵進行分組時,可以在GroupBy函數中傳入多個列名。例如,以下代碼將會按照“name”和“sex”兩個列進行分組:
grouped = df.groupby(['name', 'sex'])
通過以上代碼,我們就可以將數據分成多個組,每個組都是由“name”和“sex”兩個列值所確定的。
八、使用Categorical類型進行分組
有時候我們需要將數據按照分類值進行分組操作,可以使用Pandas中的Categorical類型。以下代碼將會將年齡分成三個分類,然後根據分類進行分組:
df['age_group'] = pd.cut(df['age'], [20, 30, 40, 50])
grouped = df.groupby('age_group')
通過以上代碼,我們將“age”列按照20-30、30-40、40-50三個區間進行了分類,並且將分類保存到了“age_group”列中。
九、使用自定義函數進行複雜分組
有時候需要根據自定義的規則進行複雜的分組操作,可以通過自定義函數來實現。以下代碼將會根據每個人工資是否高於平均工資進行分組:
def higher_salary(group):
return group['salary'].mean() < group['salary']
grouped = df.groupby(higher_salary)
以上代碼使用了自定義的函數“higher_salary”,該函數返回一個Series對象,表示每個人的工資是否高於平均工資。然後,我們可以根據該函數的返回值進行分組操作。
總結
通過本文的介紹,我們了解到了Pandas GroupBy函數的基本功能和用法,包括數據分組、apply()、aggregate()、transform()、agg()等常用函數。此外,我們還介紹了如何使用GroupBy對象獲取分組信息,以及如何使用多個鍵、Categorical類型和自定義函數進行複雜分組。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/207034.html