如何通过字典值一次性为Pandas DataFrame分配多列?
解决Pandas中从字典结果提取值分配到多列的问题
你的问题出在:当直接对字典进行迭代时,Python默认会遍历字典的键,所以zip(*df["col2"].map(fun_function))拆分出来的是字典的键序列,而非值。以下是几种在调用端处理的可行方案:
方案1:用Lambda提取字典的值(保持顺序)
利用lambda将每个字典转换为值的列表,再进行拆分:
import pandas as pd data = { "col1": [420, 380, 390], "col2": [50, 40, 45] } df = pd.DataFrame(data) def fun_function(my_input): fun_dict = {} fun_dict["num1"] = str(my_input)[0] fun_dict["num2"] = str(my_input)[1] return fun_dict # 修改后的调用代码 df["first_num_col"], df["last_num_col"] = zip(*df["col2"].map(lambda x: list(fun_function(x).values())))
注:Python 3.7及以上版本中,字典会保留插入顺序,所以
values()的顺序和你定义num1、num2的顺序一致。
方案2:明确指定提取对应键的值(更稳妥)
如果担心字典顺序可能变化,直接指定提取目标键的值,避免依赖顺序:
df["first_num_col"], df["last_num_col"] = zip(*df["col2"].map(lambda x: (fun_function(x)["num1"], fun_function(x)["num2"])))
方案3:用Apply转换为DataFrame再合并
这种方式可读性更强,尤其适合字典键较多的场景:
# 将每个字典转换为一行的DataFrame new_columns_df = df["col2"].apply(fun_function).apply(pd.Series) # 重命名列并合并到原DataFrame new_columns_df.columns = ["first_num_col", "last_num_col"] df = pd.concat([df, new_columns_df], axis=1)
以上三种方案都不需要修改fun_function的返回值,完全在调用端完成值的提取与列分配。
内容的提问来源于stack exchange,提问作者Droid-Bird
相关产品推荐
相关产品推荐

