跳至主要內容

数据透视

blacklad大约 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 注意

  1. 唯一性要求pivot 函数要求组合后的 indexcolumns 是唯一的。如果存在重复项,则会引发 ValueError: Index contains duplicate entries, cannot reshape 错误。在这种情况下,你可以使用 pivot_table 函数,它可以处理重复项并允许进行数据聚合。
  2. 缺失值处理:如果透视操作导致某些值缺失,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
上次编辑于:
贡献者: blacklad