数据透视
大约 3 分钟PythonPythonPandas
数据透视
数据透视表是用于汇总、分组和聚合数据的一种工具。它允许你通过不同的维度(通常是行和列)对数据进行重新排列和总结,从而提供一种灵活的数据查看方式。
1 整理透视
pivot
函数可以返回按照指定的索引、列 重新组织成新的 DataFrame。
import pandas as pd
data = {
'姓名': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'科目': ['Math', 'Math', 'Math', 'English', 'English', 'English'],
'成绩': [85, 78, 92, 90, 80, 88]
}
df = pd.DataFrame(data)
print(df)
pivoted_df = df.pivot(index='姓名', columns='科目', values='成绩')
print(pivoted_df)
姓名 科目 成绩
0 Alice Math 85
1 Bob Math 78
2 Charlie Math 92
3 Alice English 90
4 Bob English 80
5 Charlie English 88
科目 English Math
姓名
Alice 90 85
Bob 80 78
Charlie 88 92
可以看出整理后的数据更直观的查看每个学生的成绩了。
1.1 参数
- index:指定在透视表中作为行索引的列,通常是你想要用作行标签的数据。
- columns:指定在透视表中作为列索引的列。
- values:指定要填充到透视表中的数据。
1.2 注意
- 唯一性要求:
pivot
函数要求组合后的index
和columns
是唯一的。如果存在重复项,则会引发ValueError: Index contains duplicate entries, cannot reshape
错误。在这种情况下,你可以使用pivot_table
函数,它可以处理重复项并允许进行数据聚合。 - 缺失值处理:如果透视操作导致某些值缺失,Pandas 会在相应位置插入
NaN
。如果你想用特定值填充这些缺失值,可以在操作完成后使用fillna()
方法。
2 聚合透视
pivot_table
,可以处理多重聚合操作,允许通过多个函数对数据进行聚合,如 sum、mean、count 等,而且可以处理重复值,通过指定聚合函数来避免冲突。
import pandas as pd
# 创建 DataFrame
data = {
'姓名': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie',
'Alice', 'Bob', 'Charlie', 'Alice', 'Bob', 'Charlie'],
'学期': ['一', '一', '一', '二', '二', '二',
'一', '一', '一', '二', '二', '二'],
'科目': ['Math', 'Math', 'Math', 'Math', 'Math', 'Math',
'English', 'English', 'English', 'English', 'English', 'English'],
'成绩': [85, 78, 92, 88, 76, 85, 90, 80, 88, 95, 82, 91]
}
df = pd.DataFrame(data)
print(df)
pivot = pd.pivot_table(df, values='成绩', index='姓名', columns='科目')
print(pivot)
姓名 学期 科目 成绩
0 Alice 一 Math 85
1 Bob 一 Math 78
2 Charlie 一 Math 92
3 Alice 二 Math 88
4 Bob 二 Math 76
5 Charlie 二 Math 85
6 Alice 一 English 90
7 Bob 一 English 80
8 Charlie 一 English 88
9 Alice 二 English 95
10 Bob 二 English 82
11 Charlie 二 English 91
科目 English Math
姓名
Alice 92.5 86.5
Bob 81.0 77.0
Charlie 89.5 88.5
默认是计算平均值。计算一下 Alice 的英语的平均成绩,可以看出正好是92.5。
print(df[ (df['姓名'] == 'Alice') & (df['科目'] == 'English') ])
print(df[ (df['姓名'] == 'Alice') & (df['科目'] == 'English') ]['成绩'].mean())
姓名 学期 科目 成绩
6 Alice 一 English 90
9 Alice 二 English 95
92.5
2.1 指定聚合参数
通过 aggfunc
可以指定具体的聚合函数。
比如计算每个学生在每个科目上的平均成绩、总成绩、最低成绩和最高成绩。
pivot_agg = pd.pivot_table(df, values='成绩', index='姓名', columns='科目', \
aggfunc=['mean', 'sum', 'min', 'max'])
print(pivot_agg)
mean sum min max
科目 English Math English Math English Math English Math
姓名
Alice 92.5 86.5 185 173 90 85 95 88
Bob 81.0 77.0 162 154 80 76 82 78
Charlie 89.5 88.5 179 177 88 85 91 92
2.2 填充缺失值
使用 fill_value
参数可以填充缺失值。
2.3 多级索引
透视表支持多级索引,可以创建层级结构。比如,我们可以按学期
和科目
进行多级索引。
pivot_multi = pd.pivot_table(df, values='成绩', index=['学期', '科目'], columns=['姓名'])
print(pivot_multi)
姓名 Alice Bob Charlie
学期 科目
一 English 90 80 88
Math 85 78 92
二 English 95 82 91
Math 88 76 85