在Pandas库中,`pivot_table`函数是一个非常强大的工具,用于创建数据透视表。它允许用户按照一个或多个键对数据进行分组,并对每个组应用聚合函数。下面是对`pivot_table`函数的基本用法、`aggfunc`参数的作用、基本示例、自定义`aggfunc`以及高级示例的详细解释。
### 1. `pivot_table`函数的基本用法
`pivot_table`函数的基本语法如下:
```python
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
```
- `data`:要进行透视的数据集。
- `values`:可选参数,指定用于聚合计算的列。如果不指定,则对所有数值列进行聚合。
- `index`:指定行索引的列名或列名列表。
- `columns`:指定列索引的列名或列名列表。
- `aggfunc`:聚合函数,默认为'mean'。可以是一个函数、函数列表或字典。
- `fill_value`:用于填充缺失值的值。
- `margins`:是否添加行/列的总计,默认为False。
- `dropna`:是否在计算时忽略缺失值,默认为True。
- `margins_name`:总计行/列的名称,默认为'All'。
### 2. `aggfunc`参数的作用
`aggfunc`参数用于指定聚合函数,它决定了如何对分组后的数据进行计算。Pandas提供了多种内置聚合函数,如`mean`(平均值)、`sum`(求和)、`count`(计数)等。此外,用户还可以自定义聚合函数。
### 3. 使用`aggfunc`参数的基本示例
```python
import pandas as pd
import numpy as np
# 创建一个示例DataFrame
data = pd.DataFrame({
'A': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'],
'B': ['one', 'one', 'two', 'two', 'one', 'one'],
'C': np.random.randn(6),
'D': np.random.randn(6)
})
# 使用mean作为聚合函数
result = pd.pivot_table(data, values='C', index=['A', 'B'], aggfunc='mean')
print(result)
```
### 4. 自定义`aggfunc`以应用多个聚合函数
`aggfunc`参数可以接受一个函数列表或字典,从而应用多个聚合函数。
- **函数列表**:对指定列应用多个聚合函数,结果将作为多级列索引返回。
```python
result = pd.pivot_table(data, values='C', index=['A', 'B'], aggfunc=[np.mean, np.sum])
print(result)
```
- **字典**:为不同列指定不同的聚合函数。
```python
result = pd.pivot_table(data, values=['C', 'D'], index=['A', 'B'], aggfunc={'C': np.mean, 'D': np.sum})
print(result)
```
### 5. 高级示例:结合使用多个`aggfunc`
下面是一个高级示例,展示了如何在`pivot_table`中结合使用多个`aggfunc`,并对结果进行格式化。
```python
# 创建一个更复杂的示例DataFrame
data = pd.DataFrame({
'Category': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'Subcategory': ['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z'],
'Sales': [150, 200, 250, 300, 350, 400, 450, 500, 550],
'Profit': [50, 60, 70, 80, 90, 100, 110, 120, 130]
})
# 使用多个聚合函数,并将结果格式化为多级列索引
result = pd.pivot_table(data, values=['Sales', 'Profit'], index=['Category', 'Subcategory'],
aggfunc={'Sales': [np.sum, np.mean], 'Profit': [np.sum, np.mean]})
# 设置多级列索引的名称
result.columns = pd.MultiIndex.from_tuples([
('Sales', 'Sum'), ('Sales', 'Mean'), ('Profit', 'Sum'), ('Profit', 'Mean')
])
print(result)
```
在这个高级示例中,我们为`Sales`和`Profit`两列分别应用了`np.sum`和`np.mean`两个聚合函数,并将结果格式化为多级列索引,以便更清晰地展示数据。