You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分字典格式列?DataFrame清洗后拆分失败求解

嘿,这两个问题我日常处理DataFrame时经常碰到,给你分享下亲测有效的解决方案:

1. 如何将DataFrame中单元格为字典类型的列拆分为多个列?

如果你的DataFrame里有一列(比如叫dict_column),每个单元格都是标准的字典结构,最直接高效的方法是把这一列转成新的DataFrame,再和原表合并。

举个实际例子:

import pandas as pd

# 构造示例DataFrame
data = {
    'id': [1, 2, 3],
    'user_info': [
        {'name': 'Alice', 'age': 28},
        {'name': 'Bob', 'age': 32},
        {'name': 'Charlie', 'age': 25}
    ]
}
df = pd.DataFrame(data)

# 拆分字典列
dict_df = pd.DataFrame(df['user_info'].tolist())
# 合并回原DataFrame
result_df = pd.concat([df.drop('user_info', axis=1), dict_df], axis=1)
print(result_df)

如果有些字典存在键缺失的情况,tolist()会自动用NaN填充对应的单元格,非常省心。要是你处理的是小数据集,也可以用df['user_info'].apply(pd.Series)来拆分,但大数据量下tolist()的速度会快很多。

2. 先保留数字和字母,再执行拆分操作的解决方案

你说尝试多种方法都失败,大概率是字典里的字符串包含了非数字字母的特殊字符,导致后续拆分出问题。解决思路是先清洗字典里的每个值,只保留数字和字母,再进行拆分。

这里用正则表达式来做清洗,直接上代码:

import pandas as pd
import re

# 构造带脏数据的示例DataFrame
dirty_data = {
    'id': [1, 2],
    'user_info': [
        {'name': 'Alice!@#', 'age': '28$%^'},
        {'name': 'Bob*()', 'age': '32&*('}
    ]
}
df = pd.DataFrame(dirty_data)

# 定义清洗函数:只保留字符串中的数字和字母
def clean_dict_values(d):
    cleaned = {}
    for k, v in d.items():
        # 先把值转成字符串,再用正则替换掉非数字字母的字符
        cleaned_v = re.sub(r'[^a-zA-Z0-9]', '', str(v))
        # 如果是数字类型的字段,可以转回去(可选)
        if k == 'age':
            cleaned_v = int(cleaned_v)
        cleaned[k] = cleaned_v
    return cleaned

# 清洗字典列
df['cleaned_user_info'] = df['user_info'].apply(clean_dict_values)

# 拆分清洗后的字典列
cleaned_dict_df = pd.DataFrame(df['cleaned_user_info'].tolist())
final_df = pd.concat([df.drop(['user_info', 'cleaned_user_info'], axis=1), cleaned_dict_df], axis=1)
print(final_df)

这个方法的关键是先遍历每个字典的键值对,用re.sub把所有非数字字母的字符替换为空,确保后续拆分时数据是干净的。如果你的字典里有不同类型的字段(比如数字、字符串),可以在清洗函数里针对性处理,比如把清洗后的数字字符串转回整数。

内容的提问来源于stack exchange,提问作者Edward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:25:07