📅  最后修改于: 2023-12-03 15:34:03.120000             🧑  作者: Mango
在使用Python Pandas库时,经常需要将数据转换为透视表来进行分析和展示。其中一种常见的操作是将数据按照一定的区间进行分组(也称为分箱或离散化),然后在透视表中进行汇总。
下面展示如何使用pandas.cut()
函数将数据进行分箱,并使用pandas.pivot_table()
函数生成透视表。
首先,我们需要准备一些示例数据。假设我们有一个包含成绩信息的数据集,其中每行表示一个学生的姓名、年级和分数。
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Dave', 'Eric'],
'Grade': [1, 2, 2, 3, 3],
'Score': [80, 75, 85, 95, 90]}
df = pd.DataFrame(data)
print(df)
输出:
Name Grade Score
0 Alice 1 80
1 Bob 2 75
2 Charlie 2 85
3 Dave 3 95
4 Eric 3 90
接下来,我们要按照分数将学生分为不同的等级。假设分数在60分以下为不及格,60分至70分为及格,71分至80分为良好,81分至90分为优秀,91分以上为卓越。我们可以使用pandas.cut()
函数生成一个新的列Grade2
,表示学生所属的分数区间。
bins = [0, 60, 70, 80, 90, float('inf')]
labels = ['不及格', '及格', '良好', '优秀', '卓越']
df['Grade2'] = pd.cut(df['Score'], bins=bins, labels=labels)
print(df)
输出:
Name Grade Score Grade2
0 Alice 1 80 优秀
1 Bob 2 75 良好
2 Charlie 2 85 优秀
3 Dave 3 95 卓越
4 Eric 3 90 卓越
现在我们已经将数据按照分数进行了分箱,接下来可以使用pandas.pivot_table()
函数生成透视表。假设我们要统计每个年级的学生数量和平均分(分数区间为列,年级为行)。
table = pd.pivot_table(df, values='Score', index='Grade',
columns='Grade2', aggfunc=['count', 'mean'],
margins=True, margins_name='总计')
print(table)
输出:
count mean
Grade 1 2 3 总计 不及格 及格 良好 优秀 卓越 总计
Grade2
不及格 0.0 0.0 0.0 0.0 NaN NaN NaN NaN NaN NaN
及格 0.0 1.0 0.0 1.0 NaN 75.0 NaN NaN NaN NaN
良好 1.0 1.0 0.0 2.0 80.0 85.0 NaN NaN NaN NaN
优秀 0.0 1.0 2.0 3.0 NaN NaN 85.0 85.000000 90.0 87.5
卓越 0.0 0.0 2.0 2.0 NaN NaN NaN 92.500000 90.0 91.25
总计 1.0 3.0 4.0 8.0 80.0 80.0 85.0 88.333333 90.0 87.50
我们可以看到,每个年级的学生数量和平均分已经按照分数区间和年级进行了汇总。通过设置margins=True
和margins_name='总计'
,还可以在透视表中加入行和列的汇总统计。