Python pandas如何将存储字典的字符串列拆分为多个独立列
列内字典字符串拆分扩列问题
示例数据
输入数据结构:
import pandas as pd df = pd.DataFrame({'column1':["{'A':2,'B':3,'c':2}", "{'A': 3, 'B': 5, 'c': 10}"]}) print(df)
输入打印结果:
column1 0 {'A': 2, 'B': 3, 'c': 2} 1 {'A': 3, 'B': 5, 'c': 10}
期望输出:将字典的键拆为独立列,对应值按行匹配
A B c 0 2 3 2 1 3 5 10
参考方案中*的作用
你找到的参考代码:
pd.DataFrame([*df['column1'].apply(eval)])
代码执行逻辑拆解:
df['column1'].apply(eval):逐行把列内的字符串格式字典,通过eval转换为Python原生字典对象,返回值是元素为字典的pandas Series。*是Python的可迭代对象解包运算符,作用是把Series这个可迭代对象里的每个字典元素逐个展开,外层的[]会把展开的所有字典收集为一个列表。比如Series里存了d1、d2两个字典,[*series]等价于[d1, d2]。- 最后传入字典列表给
pd.DataFrame()时,pandas会自动将字典的公共键作为列名,逐行填充对应值,得到目标结果。
注意:
eval会直接执行传入的字符串内容,如果你的CSV文件来源不可信,存在执行恶意代码的风险,不推荐生产环境使用。
更优实现方案
方案1:官方专用方法(性能最优、最安全)
使用pandas内置的json_normalize方法处理字典/JSON结构扩列,搭配ast.literal_eval做安全的字符串转字典操作(仅解析Python字面量,不会执行任意代码):
import ast import pandas as pd # 字符串列先安全转为字典,再自动拆分为列 result = pd.json_normalize(df['column1'].apply(ast.literal_eval))
如果你的列内本身已经存储的是字典对象而非字符串,可以直接省略apply步骤:
result = pd.json_normalize(df['column1'])
这个方案在数据量越大时性能优势越明显,比参考方案速度快2~5倍,是官方推荐的写法。
方案2:可读性优先写法
通过两次apply实现,逻辑直观不需要理解解包语法,适合小数据量场景:
import ast result = df['column1'].apply(ast.literal_eval).apply(pd.Series)
内容的提问来源于stack exchange,提问作者waqar ali
相关产品推荐
相关产品推荐

