python pandas数据透视
0 背景
在Excel里面有个数据透视表的功能, 用于数据透视操作可以将数据从长格式转换为宽格式, 以便用于特定场景下的数据分析. 同样在 Python Pandas 中,透视操作(如 pivot
和 pivot_table
)用于重新组织和转换数据,以便更好地理解和分析. 在销售数据分析, 财务报表, 人力资源管理, 科学研究数据处理, 市场研究等很多场景都会用到。
以下是一些主要用途:
-
数据重塑:透视操作可以将数据从长格式转换为宽格式,或反之,从而使数据适合不同类型的分析。 -
数据汇总:使用 pivot_table
可以轻松地对数据进行分组汇总,比如计算各类别的平均值、总和等。 -
提高可读性和可解释性:通过透视,可以将数据以更清晰和直观的方式呈现,使得数据分析和报告更加易于理解。 -
便于比较:通过重塑数据,可以更方便地比较不同类别或时间段的数据。 -
数据清洗:在数据清洗过程中,透视操作有助于识别数据中的异常值或错误。
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(2024, 1, 1), datetime(2024, 1, 2), datetime(2024, 1, 1),
datetime(2024, 1, 2), datetime(2024, 1, 1), datetime(2024, 1, 2)],
"销售额": [200, 150, 300, 250, 300, 400]
}
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