如何用Pandas apply()自动解析未知长度/键的字典返回值
两种可行实现思路
思路1:直接利用apply的result_type='expand'自动扩展
不用提前指定列名,当apply返回字典时,设置result_type='expand'会自动把字典的键作为新列名,对应值填充到列中,最后把扩展后的结果和原DataFrame合并即可。
示例代码:
import pandas as pd def func(x): # 模拟返回动态键的字典(不同行可返回不同键) if x % 2 == 0: return {'B': x+1, 'C': x+2} else: return {'B': x+1, 'D': x+3} df = pd.DataFrame({'A': range(5)}) # 执行apply并自动展开字典为列 expanded_df = df.apply(lambda x: func(x['A']), axis=1, result_type='expand') # 合并原DataFrame和展开后的列 df = pd.concat([df, expanded_df], axis=1) print(df)
输出会自动生成所有字典中出现过的列,缺失值用NaN填充:
A B C D 0 0 1 2.0 NaN 1 1 2 NaN 4.0 2 2 3 4.0 NaN 3 3 4 NaN 6.0 4 4 5 6.0 NaN
思路2:先存字典到单列,再拆分展开
如果需要保留原始字典数据,或者中间要对字典做额外处理,可以先把字典存入DataFrame的单个列,再将该列拆分为多列。
示例代码:
import pandas as pd def func(x): return {'B': x+1, 'C': x+2} df = pd.DataFrame({'A': range(5)}) # 先将字典存入单列 df['result_dict'] = df.apply(lambda x: func(x['A']), axis=1) # 将字典列拆分为多列 expanded_df = pd.DataFrame(df['result_dict'].tolist()) # 合并并删除临时字典列 df = pd.concat([df, expanded_df], axis=1).drop('result_dict', axis=1) print(df)
输出结果和原示例一致:
A B C 0 0 1 2 1 1 2 3 2 2 3 4 3 3 4 5 4 4 5 6
内容的提问来源于stack exchange,提问作者Mike H
相关产品推荐
相关产品推荐

