py880函数库:让Pandas透视表和Excel操作更强大
前言
在python数据分析工作中,我们经常需要制作透视表和操作Excel文件。虽然Pandas提供了基础功能,但在实际使用中总有一些痛点:
-
· Pandas透视表功能有限:无法实现复杂的自定义聚合,多层表头处理繁琐 -
· Excel文件必须关闭才能写入:反复开关文件严重影响调试节奏 -
· 缺少像VBA那样的实时调试能力:无法在Excel打开的状态下即时查看结果
为了解决这些问题,我开发了py880函数库,对Pandas进行了全面增强。今天重点介绍三个核心功能:
-
1. z超级透视表 – 比Pandas更强大的透视表功能 -
2. vba.excel读取到df – 实时读取Excel数据 -
3. vba.excel写入 – 在Excel打开状态下实时写入数据 -
本函数库对 郑广学python办公自动化 所有学员免费发放 -
下载code880项目模板v.4.1即可直接使用
一、突破性功能:实时读写打开的Excel文件
传统Pandas的痛点
使用原生Pandas操作Excel时,必须:
-
1. 关闭Excel文件 -
2. 运行Python代码写入 -
3. 打开Excel文件查看结果 -
4. 发现问题,关闭文件 -
5. 修改代码,重复上述步骤…
这种工作流程严重影响调试效率!
如果不关闭文件 写入就会报错
py880的解决方案:具备VBA对等的实时调试能力
py880函数库通过调用Excel COM对象,实现了在Excel打开状态下的实时读写,就像使用VBA一样!
核心函数介绍
1. vba.excel读取到df(范围)
从Excel中实时读取数据到Pandas DataFrame
from py880 import vba
# 直接读取当前打开的Excel文件
df = vba.excel读取到df("A1:J1", "数据") # 从"数据"工作表读取
# 或者使用Range对象
df = vba.excel读取到df(Application.Range("A1:G6"))
2. vba.excel写入(数据, 目标位置)
将数据实时写入到打开的Excel文件
# 写入列表数据
vba.excel写入(列表数据, "test!A1")
# 写入DataFrame(自动转换)
vba.excel写入(df, sheet.Range("A2"))
# 返回写入的Range对象,可以继续操作
rng = vba.excel写入(数据, "A1")
rng.EntireColumn.AutoFit() # 列宽自适应
完整使用示例
from py880 import vba
from py880.log_helper import logtable
# 准备测试数据
列表 = [
['分类', '分类', '产品信息', '产品信息', '产品信息', '销售数据', '销售数据'],
['大类', '小类', '名称', '型号', '价格', '数量', '总额'],
['电子', '手机', 'iPhone', '14 Pro', 7999, 50, 399950],
['电子', '电脑', 'MacBook', 'Air M2', 8999, 30, 269970],
['家电', '冰箱', '海尔', 'BCD-470', 3999, 20, 79980],
]
# 获取Excel Application对象,像VBA一样操作
Application = vba.excel.Application
sht = Application.Sheets.Add()
# 实时写入数据
sht.Range("A1").Value = "test"
sht.Range("A1").Interior.Color = vba.RGB("#07C160") # 设置单元格颜色
vba.excel写入(列表, sht.Range("A2"))
# 实时读取数据
数据 = vba.excel读取到list(Application.Range("A2:G6"))
logtable(数据) # 在控制台以表格形式查看
<图片>
关键优势总结
|
|
|
|
| 文件状态 |
|
|
| 调试效率 |
|
|
| 操作方式 |
|
|
| 单元格格式 |
|
|
| 即时反馈 |
|
|
| 学习成本 |
|
|
二、z超级透视表:从简单到复杂的全场景支持
为什么需要z超级透视表?
Pandas原生的pivot_table功能有限:
-
· 聚合函数只能用简单的sum、mean等 -
· 多层表头处理复杂 -
· 无法实现自定义复杂计算 -
· 输出格式不符合Excel使用习惯
z超级透视表完全兼容Pandas语法,同时提供强大的扩展功能!
场景1:基础透视(与Pandas对比)
示例数据
字典形式数据 = {
'地区': ['北京', '北京', '上海', '上海','北京', '北京', '上海', '上海'],
'产品': ['手机', '电脑', '手机', '电脑','手机', '电脑', '手机', '电脑'],
'客户类型': ['个人'] * 4 + ['公司'] * 4,
'销量': [100, 50, 120, 60, 80, 40, 90, 55],
'单价': [5000, 8000, 5200, 8200, 5100, 8100, 5300, 8300],
'成本': [3000, 5000, 3100, 5100, 3050, 5050, 3150, 5150],
}
df = pd.DataFrame(字典形式数据)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pandas原生写法
透视 = pd.pivot_table(
df,
index='地区',
columns='产品',
values=['销量', '单价'],
aggfunc={'销量': 'sum', '单价': 'mean'}
)
z超级透视表写法
from py880.pandas_helper import z超级透视表
透视结果 = z超级透视表(
数据框=df,
行字段=['地区'],
列字段=['产品'],
聚合字典={
'总销量': ('销量', 'sum'),
'平均单价': ('单价', 'mean'),
'记录行数': ('产品', 'count')
},
转列表=False
)
输出结果
场景2:自定义聚合(Pandas难以实现)
需求:显示销量明细(用+号连接)
透视结果 = z超级透视表(
数据框=df,
行字段=['地区'],
列字段=['产品'],
聚合字典={
'总销量': ('销量', 'sum'),
'销量明细': ('销量', lambda x: '+'.join(map(str, x.tolist()))),
'平均单价': ('单价', 'mean'),
'记录行数': ('产品', 'count')
},

转列表=False
)
输出结果:
场景3:复杂业务计算(z超级透视表独有)
需求:计算收入、成本、利润、利润率
Pandas的pivot_table无法实现跨字段的复杂计算!
z超级透视表支持lambda函数形式,可以访问分组后的完整DataFrame:
透视结果2 = z超级透视表(
数据框=df,
行字段=['地区', '客户类型'],
列字段=['产品'],
聚合字典={
'总销量': ('销量', 'sum'),
'平均单价': ('单价', 'mean'),
'总收入': lambda g: (g['销量'] * g['单价']).sum(),
'总成本': lambda g: (g['销量'] * g['成本']).sum(),
'总利润': lambda g: ((g['单价'] - g['成本']) * g['销量']).sum(),
'利润率%': lambda g: (((g['单价']-g['成本'])*g['销量']).sum() /
(g['销量']*g['单价']).sum() * 100)
},
表头合并=1,
转列表=False
)
输出结果:
场景4:结合数据框排序功能
from py880.pandas_helper import z数据框表头排序
# 对透视结果排序:地区降序,产品升序
排序结果 = z数据框表头排序(透视结果2, ["地区-", '产品+'])
z超级透视表参数说明
z超级透视表(
数据框, # 输入的DataFrame
行字段=[], # 行分组字段列表
列字段=[], # 列分组字段列表
聚合字典={}, # 聚合规则字典
表头合并=0, # 是否合并表头(1=合并)
转列表=False, # 是否转换为列表输出
小数位数=2 # 数值小数位数(None=不处理)
)
聚合字典支持两种形式:
-
1. 元组形式: '输出列名': ('源字段', '聚合函数')
-
· 聚合函数可以是:’sum’, ‘mean’, ‘count’, ‘min’, ‘max’等 -
· 也可以是lambda函数
'输出列名': lambda g: 复杂计算表达式-
· g是分组后的DataFrame,可以进行任意复杂计算
三、完整工作流程示例
下面演示一个完整的数据分析流程:
import pandas as pd
from py880 import vba
from py880.pandas_helper import z数据框转列表, z超级透视表, z数据框表头排序
from py880.log_helper import logtable
# 1. 从Excel读取数据(Excel保持打开状态)
df = vba.excel读取到df("A1:J1", "数据")
logtable(df) # 在控制台查看数据
# 2. 数据透视分析
透视结果 = z超级透视表(
数据框=df,
行字段=["产品名称", "产品型号"],
列字段=['地区', '客户类型'],
聚合字典={
'销售数量': ('销售数量', 'sum'),
'平均单价': ('单价', 'mean'),
'总收入': lambda g: (g['销售数量'] * g['单价']).sum(),
},
转列表=False,
小数位数=2
)
# 3. 数据排序
透视结果 = z数据框表头排序(透视结果, ["产品名称", "产品型号"])
logtable(透视结果, 显示行数=200)
# 4. 写回Excel(实时显示结果,无需关闭文件!)
vba.excel写入(透视结果, "数据!U2")
# 5. 美化格式
rng = vba.excel写入(透视结果, "结果!A1")
rng.EntireColumn.AutoFit() # 自动调整列宽
四、功能对比总结
Pandas vs z超级透视表
|
|
|
|
| 基础聚合 |
|
|
| 自定义聚合 |
|
|
| 跨字段计算 |
|
|
| 多层表头 |
|
|
| 直接输出列表 |
|
|
| 小数位控制 |
|
|
| 中文参数 |
|
|
原生Pandas vs py880文件操作
|
|
|
|
| 读取Excel |
|
|
| 文件状态 |
|
可以打开 |
| 写入速度 |
|
|
| 格式设置 |
|
|
| 调试体验 |
|
实时查看结果 |
| 学习曲线 |
|
|
五、安装使用
安装依赖
# 如果需要使用pandas相关功能
uv add pandas openpyxl pywin32 psutil pypinyin
# 或使用pip
pip install pandas openpyxl pywin32 psutil pypinyin
导入使用
from py880 import vba
from py880.pandas_helper import z超级透视表, z数据框转列表, z数据框表头排序
from py880.log_helper import logtable, logjson
注意事项
-
1. WPS用户:需先切换为独立窗体模式 -
2. Excel状态:测试前需先打开一个Excel文件
六、总结
py880函数库的核心价值:
🚀 提升调试效率
-
· 告别反复开关Excel文件 -
· 像VBA一样实时查看结果 -
· 保持Python的强大数据处理能力
💪 增强透视表功能
-
· 支持复杂的跨字段计算 -
· 自定义聚合函数 -
· 符合Excel使用习惯的输出格式
🎯 降低学习成本
-
· 中文参数,更易理解 -
· 兼容Pandas语法 -
· 会VBA就会用Excel操作
如果你也被Pandas的限制困扰,不妨试试py880函数库!
欢迎交流讨论,共同改进!
作者:郑广学
更新日期:2025年11月9日