??一、數據分組(GroupBy)??
??核心概念??:將數據按指定字段分組,對每組進行聚合、轉換或過濾操作。
??1. 分組聚合(Aggregation)??
將分組數據聚合成單個值(如平均值、總和)。
??單變量分組聚合??:
import pandas as pd df = pd.read_csv('data/gapminder.tsv', sep='\t') # 按年份分組計算平均壽命 result = df.groupby('year')['lifeExp'].mean()
??Pandas內置聚合方法??:
count()
,mean()
,std()
,median()
,sum()
,min()
,max()
等。示例:
df.groupby('continent')['lifeExp'].describe() # 同時計算多個統計量
??自定義聚合函數??:
def my_mean(values): return sum(values) / len(values) # 使用agg調用自定義函數 df.groupby('year')['lifeExp'].agg(my_mean)
??多函數聚合??:
result = df.groupby('year')['lifeExp'].agg(['count', 'mean', 'std']) # 重命名結果列 result.columns = ['count_nonzero', 'mean', 'std']
??多列不同聚合操作??:
df.groupby('year').agg({ 'lifeExp': 'mean', 'pop': 'median', 'gdpPercap': 'median' }).rename(columns={ 'lifeExp': '平均壽命', 'pop': '人口', 'gdpPercap': '人均Gdp' }).reset_index()
??2. 分組轉換(Transformation)??
保持數據維度不變,對每組進行轉換(如標準化、填充缺失值)。
??計算Z分數??:
def my_zscore(x): return (x - x.mean()) / x.std() df['z_score'] = df.groupby('year')['lifeExp'].transform(my_zscore)
??分組填充缺失值??:
tips = pd.read_csv('data/tips.csv').sample(10, random_state=42) tips.loc[np.random.permutation(tips.index)[:4], 'total_bill'] = np.NaN # 構造缺失值 def fill_na_mean(x): return x.fillna(x.mean()) # 用組內均值填充缺失值 tips['fill_total_bill'] = tips.groupby('sex')['total_bill'].transform(fill_na_mean)
??3. 分組過濾(Filtration)??
根據條件篩選分組(如刪除組內數據量不足的分組)。
# 過濾組內數據量>30的分組
tips_filtered = tips.groupby('size').filter(lambda x: len(x) > 30)
tips_filtered['size'].value_counts()
??4. DataFrameGroupBy對象操作??
分組后返回DataFrameGroupBy
對象,支持進一步操作。
??查看分組??:
grouped = tips.groupby('sex') grouped.groups # 顯示分組索引 female_group = grouped.get_group('Female') # 提取特定組
??遍歷分組??:
for name, group in grouped: print(f"Group: {name}") print(group.head())
??多字段分組??:
group_avg = tips.groupby(['sex', 'time']).mean() # 返回MultiIndex group_avg.reset_index() # 轉換為普通DataFrame # 或分組時禁用索引 tips.groupby(['sex', 'time'], as_index=False).mean()
??二、數據透視表(Pivot Table)??
動態重組數據,按行列維度聚合分析。
??核心參數??
參數 | 作用 | 示例 |
---|---|---|
| 行分組字段 |
|
| 列分組字段 |
|
| 待聚合的數值列 |
|
| 聚合函數(默認 |
|
??基礎用法??
# 按大洲和年份透視平均壽命
pivot = pd.pivot_table( df, index='continent', columns='year', values='lifeExp', aggfunc='mean'
)
??多維度聚合??
# 同時計算均值和標準差
pivot_multi = pd.pivot_table( df, index='continent', columns='year', values='lifeExp', aggfunc=['mean', 'std']
)
??三、關鍵區別總結??
??操作?? | ??輸入?? | ??輸出?? | ??特點?? |
---|---|---|---|
??聚合(Agg)?? | 每組數據 | ??單個值??(如均值) | 數據維度降低 |
??轉換(Transform)?? | 每組數據 | ??同維度數據??(如Z分數) | 維度不變,支持向量化操作 |
??過濾(Filter)?? | 整組數據 | ??篩選后的組??(如刪除小組) | 按組條件篩選 |
??透視表?? | 全表數據 | ??重組后的聚合表?? | 動態行列分析,支持多級分組 |
??四、最佳實踐??
??分組前預處理??:確保分組字段無缺失值。
??優先內置函數??:如
mean()
比自定義循環高效。??透視表替代多重分組??:簡化多維度聚合代碼。
??利用
reset_index()
??:將分組索引轉換為列便于后續分析。
示例代碼需結合實際數據文件運行,建議在Jupyter Notebook中逐步練習以加深理解。