📜  python Pandas pivot on bin - Python (1)

📅  最后修改于: 2023-12-03 15:34:03.120000             🧑  作者: Mango

Python Pandas pivot on bin

在使用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=Truemargins_name='总计',还可以在透视表中加入行和列的汇总统计。