如何遍历pandas DataFrame列表生成对应命名字典并转换问卷响应?
问卷编码转换解决方案
一、遍历生成目标字典列表
完全可以实现,步骤如下:
- 先把所有问题对应的DataFrame放进一个列表:
# 把Q1到Q14的DataFrame依次存入列表 question_dfs = [Q1_df, Q2_df, Q3_df, Q4_df, Q5_df, Q6_df, Q7_df, Q8_df, Q9_df, Q10_df, Q11_df, Q12_df, Q13_df, Q14_df]
- 用列表推导式批量生成字典列表:
# 每个DataFrame转成Key:Value格式的字典,结果存在dict_list里 dict_list = [df.set_index('Key')['Value'].to_dict() for df in question_dfs]
此时dict_list[0]就是Q1对应的字典,dict_list[1]对应Q2,以此类推。如果一定要单独生成Q1_dict、Q2_dict这类变量,可以用循环批量赋值:
# 批量创建Q1_dict到Q14_dict变量 for idx, mapping_dict in enumerate(dict_list, start=1): globals()[f'Q{idx}_dict'] = mapping_dict
二、更简便的处理方案(推荐)
没必要单独拆分Qn_df或创建Qn_dict,直接批量处理更高效:
方案1:从原始编码定义表直接生成所有映射字典
如果你的编码定义表包含「问题编号(如Q1)、Key、Value」三列,直接按问题分组生成全局映射字典:
# 假设编码定义表为code_definitions,列名是Question、Key、Value all_mappings = code_definitions.groupby('Question').apply( lambda group: group.set_index('Key')['Value'].to_dict() ).to_dict()
生成的all_mappings是一个嵌套字典,结构为{'Q1': {1:'编码1定义'}, 'Q2': {2:'编码2定义'}, ...},之后直接批量转换问卷响应表:
# 假设问卷响应表为responses,列名对应Q1到Q14 for col in responses.columns: responses[col] = responses[col].map(all_mappings[col])
方案2:基于已拆分的Qn_df批量转换
如果已经拆分好了Q1_df到Q14_df,直接循环对应列转换:
# 确保question_dfs的顺序和responses的列顺序一致 for col, df in zip(responses.columns, question_dfs): mapping = df.set_index('Key')['Value'].to_dict() responses[col] = responses[col].map(mapping)
注意事项
- 尽量避免单独创建Q1_dict这类零散变量,用列表或字典统一管理映射关系,代码更整洁且易维护。
- 如果编码中存在缺失值(NaN),可以用
map的替代方法replace,或者加上fillna保留原始值:responses[col] = responses[col].map(mapping).fillna(responses[col])
内容的提问来源于stack exchange,提问作者Graham Galloway
相关产品推荐
相关产品推荐

