python pandas数据透视

python pandas数据透视

0 背景

python pandas数据透视

在Excel里面有个数据透视表的功能, 用于数据透视操作可以将数据从长格式转换为宽格式, 以便用于特定场景下的数据分析. 同样在 Python Pandas 中,透视操作(如 pivotpivot_table)用于重新组织和转换数据,以便更好地理解和分析. 在销售数据分析, 财务报表, 人力资源管理, 科学研究数据处理, 市场研究等很多场景都会用到。

以下是一些主要用途:

  1. 数据重塑:透视操作可以将数据从长格式转换为宽格式,或反之,从而使数据适合不同类型的分析。
  2. 数据汇总:使用 pivot_table 可以轻松地对数据进行分组汇总,比如计算各类别的平均值、总和等。
  3. 提高可读性和可解释性:通过透视,可以将数据以更清晰和直观的方式呈现,使得数据分析和报告更加易于理解。
  4. 便于比较:通过重塑数据,可以更方便地比较不同类别或时间段的数据。
  5. 数据清洗:在数据清洗过程中,透视操作有助于识别数据中的异常值或错误。

1 使用

基础语法

pivot()

def pivot(
        self, *, columns, index=lib.no_default, values=lib.no_default
    )
 -> DataFrame
  • index: 要作为新DataFrame的行索引的列名。
  • columns: 要作为新DataFrame的列索引的列名。
  • values: 用于填充新DataFrame的值的列名。

pivot_table()

def pivot_table(
        self,
        values=None,
        index=None,
        columns=None,
        aggfunc: AggFuncType = "mean",
        fill_value=None,
        margins: bool = False,
        dropna: bool = True,
        margins_name: Level = "All",
        observed: bool = False,
        sort: bool = True,
    )
 -> DataFrame:

  • values: 要聚合的列名或列名列表。
  • index: 要作为新DataFrame的行索引的列名或列名列表。
  • columns: 要作为新DataFrame的列索引的列名或列名列表。
  • aggfunc: 用于聚合的函数或函数列表,默认为 ‘mean’。可以使用诸如 ‘sum’、’count’、’mean’ 等内置函数,也可以使用自定义函数,也可以使用。
  • fill_value: 替换结果表中的缺失值的值。
  • margins: 是否添加行/列小计或总计,默认为 False。
  • dropna: 是否删除所有条目均为 NaN 的列,默认为 True。
  • margins_name: 边际行/列的名称,默认为 ‘All’。

初始化数据

import pandas as pd
import numpy as np
from datetime import datetime
data = {
    "员工姓名": ["张三""李四""张三""王五""李四""张三"],
    "销售日期": [datetime(202411), datetime(202412), datetime(202411),
                 datetime(202412), datetime(202411), datetime(202412)],
    "销售额": [200150300250300400]
}
df = pd.DataFrame(data)

'''
  员工姓名       销售日期  销售额
0   张三 2024-01-01  200
1   李四 2024-01-02  150
2   张三 2024-01-01  300
3   王五 2024-01-02  250
4   李四 2024-01-01  300
5   张三 2024-01-02  400
'''

聚合透视

基础聚合透视

使用基础的pivot进行数据透视:

df.pivot(index='销售日期', columns='员工姓名', values='销售额')

'''
ValueError: Index contains duplicate entries, cannot reshape
'''

在上面代码运行结果中, 报了一个错误, 是因为张三 2024-01-01出现了两次, pivot函数并不是支持重复值的计算, 如果需要对重复值进行计算, 比如求平均值, 总和, 我们后面可以利用pivot_table 函数进行高级的透视操作.

然后我们处理一下重复数据, 再使用pivot函数试试:

df1 = df.groupby(['员工姓名''销售日期']).sum().reset_index()

'''
  员工姓名       销售日期  销售额
0   张三 2024-01-01  500
1   张三 2024-01-02  400
2   李四 2024-01-01  300
3   李四 2024-01-02  150
4   王五 2024-01-02  250
'''


df1.pivot(index='销售日期', columns='员工姓名', values='销售额')

'''
员工姓名           张三     李四     王五
销售日期                           
2024-01-01  500.0  300.0    NaN
2024-01-02  400.0  150.0  250.0
'''

接着, 我们进入高级的pivot_table 数据透视操作:

我们以销售日期为索引, 员工姓名为列, 销售额为值(默认是平均值), 建立数据透视表:

df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', )

'''
员工姓名           张三     李四     王五
销售日期                           
2024-01-01  250.0  300.0    NaN
2024-01-02  400.0  150.0  250.0
'''

聚合透视高级操作

使用aggfunc参数, 对聚合的值进行复杂的聚合操作, 默认是mean平均值, 当然, 我们也可以使用其他的'sum'、'count'、'mean' 等内置函数进行操作, 可以是字符串, 列表(多个函数), 字典(对具体列进行具体的聚合函数).

统计每个员工每天的销售总额
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc='sum', )

'''
员工姓名           张三     李四     王五
销售日期                           
2024-01-01  500.0  300.0    NaN
2024-01-02  400.0  150.0  250.0
'''

统计每个员工每天的平均销售额
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc='mean', )

'''
员工姓名           张三     李四     王五
销售日期                           
2024-01-01  250.0  300.0    NaN
2024-01-02  400.0  150.0  250.0
'''

统计每个员工每天的销售总额, 平均销售额, 销售数目
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc=['mean''count'], )

'''
             mean               count          
员工姓名           张三     李四     王五    张三   李四   王五
销售日期                                           
2024-01-01  250.0  300.0    NaN   2.0  1.0  NaN
2024-01-02  400.0  150.0  250.0   1.0  1.0  1.0
'''

指定销售额列做求和操作
df.pivot_table(index='销售日期', columns='员工姓名', aggfunc={'销售额''sum'})

'''
              销售额              
员工姓名           张三     李四     王五
销售日期                           
2024-01-01  500.0  300.0    NaN
2024-01-02  400.0  150.0  250.0
'''

将缺失的销售额设置为0
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc='sum', fill_value=0)

'''
员工姓名         张三   李四   王五
销售日期                     
2024-01-01  500  300    0
2024-01-02  400  150  250
'''

增加边栏, 对每行每列进行求和汇总
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc='sum', margins=True, )

'''
员工姓名                    张三     李四     王五   All
销售日期                                          
2024-01-01 00:00:00  500.0  300.0      0   800
2024-01-02 00:00:00  400.0  150.0  250.0   800
All                  900.0  450.0  250.0  1600
'''

将边栏设置的名称设置为合计
df.pivot_table(index='销售日期', columns='员工姓名', values='销售额', aggfunc='sum', margins=True, margins_name='合计', fill_value=0)

'''
员工姓名                  张三   李四   王五    合计
销售日期                                    
2024-01-01 00:00:00  500  300    0   800
2024-01-02 00:00:00  400  150  250   800
合计                   900  450  250  1600
'''

2 关于

本文我们介绍了Pandas如何进行透视操作。pivot 函数用于将数据从长格式转换为宽格式,适用于简单的重塑需求,但要求索引和列的组合是唯一的。pivot_table 函数更加强大和灵活,适用于复杂的数据聚合和重塑需求,可以处理重复条目,并提供多种聚合函数。透视操作是数据分析和数据科学中一个重要的步骤,能够帮助我们更有效地理解和分析数据,从而得出有价值的洞见。

如果你觉得这期内容不错的话, 欢迎点赞, 在看, 关注我的微信公众号


原文始发于微信公众号(其之):python pandas数据透视

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204739.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!