我有一个称为 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)
答案 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(...)))