首页 > 解决方案 > 从嵌套字典创建 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)  

标签: pythonpandas

解决方案


如果您让 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(...)))

推荐阅读