Pandas如何为DataFrame列内字典的数值追加%符号
Pandas字典列批量给数值加百分号实现方案
问题复现
初始测试DataFrame结构:
import pandas as pd import numpy as np df = pd.DataFrame({ 'key': [1, 2, 3, 4, 5], 'values_list': [ {'ABC': 100}, {'DEF': 100}, {'ASE': 95, 'ABC': 5}, {'ABC': 55, 'ASE': 40, 'DEF': 5}, {'DEF': 90, 'ABC': 5, 'ASE': 2.5, 'XYZ': 2.5} ] })
目标:将values_list列中每个字典的数值转为字符串,末尾添加%符号,最终效果如下:
key, values_list 1, {'ABC':100%} 2, {'DEF':100%} 3, {'ASE':95%,'ABC':5%} 4, {'ABC':55%,'ASE':40%,'DEF':5%} 5, {'DEF':90%,'ABC':5%,'ASE':2.5%,'XYZ':2.5%}
原有方法错误原因
- 方法1:
df['values_list'].str.replace(r'[0-9]+', '[0-9]%').str是pandas针对字符串类型列的访问器,当前values_list列存储的是字典对象,不是字符串,正则匹配逻辑根本不会生效;- 替换值写为
'[0-9]%'是固定字面量,就算列是字符串类型,也会把所有匹配到的数字替换成[0-9]%文本,不会保留原有数值。
- 方法2:
np.where(df['values_list'].str.isdigit(),df['values_list']+'%',df['values_list'])- 同样错误地对字典列使用
.str字符串方法,str.isdigit()会判断整个单元格内容是否为纯数字,字典对象调用该方法会全部返回False,永远不会走拼接%的逻辑分支。
- 同样错误地对字典列使用
正确实现代码
不要用字符串正则硬改字典结构,直接遍历字典重构键值对,天然兼容整数、浮点数两种数值类型:
# 核心逻辑:遍历每个字典,重新生成值带%的新字典 df['values_list'] = df['values_list'].apply( lambda item: {k: f"{v}%" for k, v in item.items()} )
如果需要输出的字典和示例展示完全一致(没有字符串引号),可以转字符串后去掉单引号:
df['values_list'] = df['values_list'].apply( lambda item: str({k: f"{v}%" for k, v in item.items()}).replace("'", "") )
执行后打印结果完全符合预期:
key values_list 0 1 {ABC:100%} 1 2 {DEF:100%} 2 3 {ASE:95%,ABC:5%} 3 4 {ABC:55%,ASE:40%,DEF:5%} 4 5 {DEF:90%,ABC:5%,ASE:2.5%,XYZ:2.5%}
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

