Python3 Pandas:如何将两个DataFrame的计数与百分比合并至同一单元格?
用Pandas融合计数与百分比DataFrame,实现同单元格双值展示
嗨,这个需求在数据可视化前的结果整理里特别常见,用Pandas的字符串格式化和元素级操作就能轻松搞定!我给你一步步拆解实现过程,附示例代码和细节优化:
1. 先构造示例数据(方便你对照测试)
首先我们先模拟两个结构完全匹配的DataFrame——一个存计数值,一个存百分比:
import pandas as pd import numpy as np # 计数值DataFrame(替换成你自己的数据源) count_df = pd.DataFrame({ 'A': [15, 28, 42], 'B': [9, 17, 31], 'C': [5, 12, 22] }, index=['Group1', 'Group2', 'Group3']) # 百分比DataFrame(这里以行总和为基准计算,你可以替换成自己的百分比数据) # 如果你的百分比已经是百分比数值(比如23.1而不是0.231),跳过*100这步 pct_df = count_df.div(count_df.sum(axis=1), axis=0).round(3) * 100
2. 核心:融合两个DataFrame的两种方法
方法一:快速字符串拼接(适合简单场景)
如果对格式要求不高,直接用元素级的字符串拼接就能快速得到结果:
# 直接拼接计数和百分比字符串 merged_df = count_df.astype(str) + ' (' + pct_df.round(1).astype(str) + '%)'
这种方法优点是代码简洁,但缺点是如果百分比是整数会出现28.0%这类不美观的格式,适合快速预览。
方法二:精细格式化(推荐用于正式展示)
如果要让格式更规范(比如百分比保留1位小数、避免多余的.0),可以自定义格式化函数,用np.vectorize实现逐元素处理:
# 自定义格式化函数:整合计数和百分比 def format_count_pct(count, pct): # 计数转整数,百分比保留1位小数,格式为「计数 (百分比%)」 return f"{int(count)} ({pct:.1f}%)" # 用vectorize批量处理所有单元格,同时保留原索引和列名 merged_df = pd.DataFrame( np.vectorize(format_count_pct)(count_df, pct_df), index=count_df.index, columns=count_df.columns )
3. 最终效果示例
运行后merged_df的输出会是这样的:
A B C Group1 15 (23.1%) 9 (13.8%) 5 (7.7%) Group2 28 (43.8%) 17 (26.6%) 12 (18.8%) Group3 42 (41.6%) 31 (30.7%) 22 (21.8%)
关键注意事项
- 确保两个DataFrame结构完全匹配:索引、列名必须一一对应,否则会出现对齐错误。如果结构不一致,先使用
count_df.align(pct_df)来对齐后再处理。 - 区分百分比的存储形式:如果你的百分比DataFrame存的是小数(比如0.231而不是23.1),记得在格式化时乘以100,比如
f"{count} ({pct*100:.1f}%)"。 - 保留原始数据:融合后的DataFrame是字符串类型,只适合展示,不要覆盖原始的数值型DataFrame,方便后续计算。
内容的提问来源于stack exchange,提问作者DForsyth
相关产品推荐
相关产品推荐

