如何基于字典构建DataFrame并生成值组合与乘积列
解决方案
直接用zip按索引匹配各键的取值,再计算乘积,最后组装成DataFrame:
import pandas as pd import math # Python3.8+支持math.prod,用于快速计算乘积 # 给定数据 names = [["name_0", "name_1"], ["name_2", "name_3"], ["name_2", "name_3", "name_4"]] dict_1 = {"name_0": [1,2], "name_1": [1,2]} dict_2 = {"name_2": [2,3], "name_3": [1,3]} dict_3 = {"name_2": [2,3], "name_3": [1,3], "name_4": [2,3]} data_3 = [dict_1, dict_2, dict_3] # 收集每行数据 rows = [] for name_group, curr_dict in zip(names, data_3): # 按names列表的顺序提取对应值的列表,保证组合顺序正确 value_lists = [curr_dict[name] for name in name_group] # 按索引打包所有值的组合(同位置元素配对) for combo in zip(*value_lists): # 计算组合的乘积 product = math.prod(combo) # 添加到行列表 rows.append({ "names": name_group, "values": list(combo), "multi": product }) # 生成DataFrame result_df = pd.DataFrame(rows) print(result_df)
关键说明:
- 按顺序匹配:通过
[curr_dict[name] for name in name_group]确保提取的值列表顺序和names中的键顺序一致,避免字典键无序导致的错误。 - 同索引组合:
zip(*value_lists)会把每个值列表的同索引元素打包成元组,正好对应你需要的values列内容。 - 兼容低版本Python:如果使用Python3.7及以下版本,替换
math.prod(combo)为手动循环相乘即可:product = 1 for num in combo: product *= num
运行后输出的DataFrame完全符合期望:
names values multi 0 [name_0, name_1] [1, 1] 1 1 [name_0, name_1] [2, 2] 4 2 [name_2, name_3] [2, 1] 2 3 [name_2, name_3] [3, 3] 9 4 [name_2, name_3, name_4] [2, 1, 2] 4 5 [name_2, name_3, name_4] [3, 3, 3] 27
内容的提问来源于stack exchange,提问作者shaftel
相关产品推荐
相关产品推荐

