python - 从嵌套字典创建 Pandas 列
问题描述
我有一个名为datastore的嵌套字典,其中包含键 m、n、o,最后是“target_a”、“target_b”或“target c”(这些包含值)。此外,我有一个熊猫数据框df,其中包含许多列。其中三个列“r”、“s”和“t”包含可用作键以在字典中查找值的值。
使用下面的代码,我尝试使用 lambda 函数来执行此操作,但是,它需要调用该函数 3 次,这似乎效率很低!有更好的方法吗?任何帮助将非常感激。
def find_targets(m, n, o):
if m == 0:
return [1.5, 1.5, 1.5]
else:
a = datastore[m][n][o]['target_a']
b = datastore[m][n][o]['target_b']
c = datastore[m][n][o]['target_c']
return [a, b, c]
df['a'] = df.apply(lambda x: find_targets(x['r'], x['s'], x['t'])[0],axis=1)
df['b'] = df.apply(lambda x: find_targets(x['r'], x['s'], x['t'])[1],axis=1)
df['c'] = df.apply(lambda x: find_targets(x['r'], x['s'], x['t'])[2],axis=1)
解决方案
如果您让 find 目标返回字典并在 lambda 中将其转换为 a pandas.Series
,则 apply 将为您创建行并返回包含所需列的数据框。
def find_targets(m, n, o):
if m == 0:
return {'a': 1.5, 'b': 1.5, 'c': 1.5}
else:
targets = {}
targets['a'] = datastore[m][n][o]['target_a']
targets['b'] = datastore[m][n][o]['target_b']
targets['c'] = datastore[m][n][o]['target_c']
return targets
abc_df = df.apply(lambda x: pd.Series(find_targets(x['r'], x['s'], x['t'])), axis=1)
df = pd.concat((df, abc_df), axis=1)
如果您无法更改find_targets
功能,您仍然可以使用所需的密钥对其进行压缩:
abc_dict = dict(zip('abc', old_find_targets(...)))
推荐阅读
- scala - 使用主机连接池时“池现在按要求关闭”是什么意思
- python - Python Elasticsearch 创建索引映射
- javascript - 如何使用 Bootstrap 4 和 Angular 7 在导航栏中制作多级下拉菜单
- azure - Azure 表单识别器因变音符号和丹麦语 Ø 失败
- simulation - 使用 SimPy 进行库存模拟
- git - git hook 设置用户名和邮箱
- shell - 如何在makefile目标中保存和返回退出代码
- html - 我可以使用 Bootstrap 列来创建此部分,并使其具有响应性吗?
- javascript - 如何在angularjs中的多个控制器中使用相同的条件
- python - Dask pivot_table 与列类型对象与列类型类别