从嵌套字典创建Pandas列

时间:2019-04-10 14:50:50

标签: python pandas

我有一个称为 datastore 的嵌套字典,其中包含键m,n,o,最后是'target_a','target_b'或'target c'(其中包含值)。另外,我有一个熊猫数据框 df ,其中包含许多列。其中的三列“ r”,“ s”和“ t”包含可以用作在字典中查找值的键的值。

在下面的代码中,我尝试使用lambda函数执行此操作,但是,它需要调用三次函数,这似乎效率很低!有更好的方法吗?任何帮助将不胜感激。

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)  

2 个答案:

答案 0 :(得分:0)

您可以让自己的申请返回pd.Series,然后使用df.merge一次完成分配工作

这里是一个示例,修改您的函数以返回pd.Series,但是您也可以找到其他解决方案,将查找函数保留为定义的值,然后将其转换为lambda表达式中的序列。

def find_targets(m, n, o):
    if m == 0:
        return pd.Series({'a':1.5, 'b':1.5, 'c':1.5})
    else:
        a = d[m][n][o]['target_a']
        b = d[m][n][o]['target_b']
        c = d[m][n][o]['target_c']
        return pd.Series({'a':a, 'b':b, 'c':c})

df.merge(df.apply(lambda x: find_targets(x['r'], x['s'], x['t']), axis=1), left_index=True, right_index=True)

答案 1 :(得分:0)

如果使查找目标返回字典,并在lambda中将其转换为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(...)))