如何在Pandas列中遍历字典列表并生成新列
解析Pandas列中的JSON字典并生成对应新列
问题场景
你手头的Pandas DataFrame里,某列的每个元素都是一组包含Name、Value、Unit的字典列表,想要把这些字典里的指标(比如Vacant结合Qty/Pct)作为新列名,对应的Value填充到新列中。比如示例数据里的Vacant有数量和占比两个维度,最终要生成Vacant_Qty、Vacant_Pct这类新列。
现有代码的问题
你当前的代码只是在拼接字符串s,完全没实现将值分配到新列的核心逻辑;而且用iterrows()逐行遍历的方式效率很低,处理大数据集时会明显拖慢速度。
推荐解决方案
我们可以用Pandas的向量式操作来高效完成这个任务,避免低效循环:
步骤1:构造示例DataFrame
先模拟你的数据场景方便演示:
import pandas as pd # 模拟你的原始数据 data = { 'Column': [ [{'Name': 'Vacant', 'Value': 3904000, 'Unit': 'Qty'}, {'Name': 'Vacant', 'Value': 11.7, 'Unit': 'Pct'}, {'Name': 'Absorption', 'Value': 415000, 'Unit': 'Units'}, {'Name': 'AbsorpOcc', 'Value': 1.4, 'Unit': 'Pct'}, {'Name': 'Occupied', 'Value': None, 'Unit': 'Qty'}] ] } df = pd.DataFrame(data)
步骤2:解析字典列表生成新列
定义一个函数把每行的字典列表转换成横向的Series,再和原DataFrame合并:
def parse_json_items(json_list): # 把每个字典转成「Name_Unit: Value」的键值对 column_map = {} for item in json_list: col_name = f"{item['Name']}_{item['Unit']}" column_map[col_name] = item['Value'] return pd.Series(column_map) # 生成新列并与原表合并 result_df = pd.concat([df, df['Column'].apply(parse_json_items)], axis=1) # 可选:删除原始的Column列 result_df = result_df.drop('Column', axis=1)
步骤3:查看最终结果
运行后result_df会包含以下新列:Vacant_Qty、Vacant_Pct、Absorption_Units、AbsorpOcc_Pct、Occupied_Qty,对应的值会正确填充,其中Occupied_Qty因为原Value是None,会自动填充为Pandas的缺失值NaN。
为什么推荐这个方法?
- 避开了
iterrows()的低效遍历,Pandas的向量操作在处理数据时性能更优 - 逻辑清晰直接,把每个字典映射为对应的列名和值,后续维护或扩展都很方便
- 自动处理缺失值,符合Pandas的数值类型规范
如果你一定要用循环(不推荐)
如果出于特殊需求必须用循环,也可以优化你的代码逻辑:
# 先收集所有可能的新列名 all_new_cols = set() for row in df['Column']: for item in row: all_new_cols.add(f"{item['Name']}_{item['Unit']}") # 初始化所有新列 for col in all_new_cols: df[col] = None # 遍历填充每个单元格的值 for index, row in df.iterrows(): for item in row['Column']: col_name = f"{item['Name']}_{item['Unit']}" df.at[index, col_name] = item['Value'] # 删除原始Column列 df = df.drop('Column', axis=1)
这种方法虽然可行,但处理大数据集时,效率远低于前面的向量式操作。
内容的提问来源于stack exchange,提问作者kms
相关产品推荐
相关产品推荐

