如何拆分电影营收预测数据集中含字典/列表的列至独立列?
解决方法:拆分包含字典/字典列表的列到独立字段
我来帮你搞定这个拆分问题,你的核心需求是把混合了单个字典和字典列表的列,提取出指定键的值,多个值用逗号拼接,缺失值用NaN填充。下面是完整的实现步骤:
1. 准备示例数据
首先先还原你的示例DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame( {'a':[1,2,3], 'b':[{'c':1}, [{'c':4},{'d':3}], [{'c':5, 'd':6},{'c':7, 'd':8}]]} )
2. 统一列数据格式
因为b列里既有单个字典,又有字典列表,我们先把所有元素统一转为列表格式,这样后续处理逻辑可以保持一致:
# 将单个字典转为包含该字典的列表,列表则保持原样 df['b'] = df['b'].apply(lambda x: [x] if isinstance(x, dict) else x)
3. 定义提取函数
接下来写一个函数,专门处理每个字典列表,提取c和d的值,多个值用逗号拼接,没有对应值则返回NaN:
def extract_key_values(row): # 收集所有字典中存在的c值,过滤掉None c_values = [d.get('c') for d in row if d.get('c') is not None] # 收集所有字典中存在的d值,过滤掉None d_values = [d.get('d') for d in row if d.get('d') is not None] # 处理值的拼接:有值就用逗号连接,无值则返回NaN c_result = ','.join(map(str, c_values)) if c_values else np.nan d_result = ','.join(map(str, d_values)) if d_values else np.nan # 返回Series,对应c和d列 return pd.Series([c_result, d_result], index=['c', 'd'])
4. 应用函数并合并结果
把函数应用到b列,然后和原DataFrame的a列合并,最后调整列顺序:
# 提取c、d列并和原a列合并 result_df = df['b'].apply(extract_key_values).join(df['a']) # 调整列顺序,让a列排在最前面 result_df = result_df[['a', 'c', 'd']]
最终结果
运行后你会得到完全符合预期的输出:
a c d 0 1 1 NaN 1 2 4 3 2 3 5,7 6,8
关键细节说明
- 用
isinstance(x, dict)判断元素类型,确保单个字典被转为列表,统一处理逻辑 - 用
dict.get(key)而不是直接dict[key],避免出现KeyError(因为有的字典没有c或d键) - 用
map(str, ...)把数值转为字符串,才能用逗号拼接多个值
内容的提问来源于stack exchange,提问作者chirag prajapati
相关产品推荐
相关产品推荐

