pandas 交叉表 透视表
时间: 2023-06-29 13:05:30 浏览: 149
Pandas 透视表和交叉表
pandas 中的交叉表和透视表都是用于数据分析和汇总的工具,但它们在处理数据时有所不同。
交叉表可以帮助我们快速计算两个或多个因素之间的频数,而透视表则可以帮助我们将数据按照不同的维度进行分组并进行聚合计算。
下面我将分别介绍一下 pandas 中的交叉表和透视表。
## 交叉表
pandas 中的 `crosstab()` 函数可以帮助我们创建交叉表。该函数的语法如下:
```python
pandas.crosstab(index, columns, values=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)
```
其中:
- `index`:用于指定行索引的列或列名。
- `columns`:用于指定列索引的列或列名。
- `values`:用于指定填充交叉表的数据列或列名。如果不指定,则默认为计数。
- `aggfunc`:用于指定对数据进行聚合计算的函数。默认为计数。
- `margins`:用于指定是否在交叉表中添加行/列合计。默认为 False。
- `margins_name`:用于指定行/列合计的名称。默认为 "All"。
- `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。
- `normalize`:用于指定是否对交叉表进行标准化。
下面是一个示例:
```python
import pandas as pd
data = {
"Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"],
"Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"]
}
df = pd.DataFrame(data)
print(df)
# 创建交叉表
ct = pd.crosstab(df["Gender"], df["City"])
print(ct)
```
输出结果为:
```
Gender Age City
0 F 30 Beijing
1 M 25 Shanghai
2 F 35 Guangzhou
3 M 40 Shenzhen
4 M 30 Shanghai
5 M 45 Beijing
6 F 35 Shenzhen
7 F 25 Guangzhou
8 M 30 Beijing
9 F 35 Shenzhen
City Beijing Guangzhou Shanghai Shenzhen
Gender
F 1 1 0 2
M 2 0 2 1
```
上面的代码首先创建了一个包含 Gender、Age 和 City 三列数据的 DataFrame。然后使用 `crosstab()` 函数创建了一个交叉表,用于统计不同性别和城市的人数。
从输出结果可以看出,交叉表中的行和列分别对应于原始数据中的 Gender 和 City 列。交叉表中的值表示对应行和列的交叉处的人数。
## 透视表
pandas 中的 `pivot_table()` 函数可以帮助我们创建透视表。该函数的语法如下:
```python
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All', dropna=True)
```
其中:
- `data`:用于指定要使用的数据集。
- `values`:用于指定要进行聚合计算的数据列或列名。
- `index`:用于指定行索引的列或列名。
- `columns`:用于指定列索引的列或列名。
- `aggfunc`:用于指定对数据进行聚合计算的函数。默认为平均值。
- `fill_value`:用于指定要用于填充缺失值的值。
- `margins`:用于指定是否在透视表中添加行/列合计。默认为 False。
- `margins_name`:用于指定行/列合计的名称。默认为 "All"。
- `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。
下面是一个示例:
```python
import pandas as pd
data = {
"Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"],
"Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35],
"City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"]
}
df = pd.DataFrame(data)
print(df)
# 创建透视表
pt = pd.pivot_table(df, values="Age", index="City", columns="Gender", aggfunc="mean")
print(pt)
```
输出结果为:
```
Gender Age City
0 F 30 Beijing
1 M 25 Shanghai
2 F 35 Guangzhou
3 M 40 Shenzhen
4 M 30 Shanghai
5 M 45 Beijing
6 F 35 Shenzhen
7 F 25 Guangzhou
8 M 30 Beijing
9 F 35 Shenzhen
Gender F M
City
Beijing 32.500000 37.500000
Guangzhou 30.000000 NaN
Shanghai NaN 27.500000
Shenzhen 35.000000 40.000000
```
上面的代码首先创建了一个包含 Gender、Age 和 City 三列数据的 DataFrame。然后使用 `pivot_table()` 函数创建了一个透视表,用于统计不同城市和性别的平均年龄。
从输出结果可以看出,透视表中的行和列分别对应于原始数据中的 City 和 Gender 列。透视表中的值表示对应行和列的交叉处的平均年龄。如果原始数据中没有某一行/列的数据,则透视表中对应的单元格会显示为 NaN。
阅读全文