我为某些交易策略创建了这个嵌套字典,例如:

{'Strategy1' :{'AAPL':'Strategy1_APPLE', 'MSFT':'Strategy1_MICROSOFT'}, 'Strategy2' :{'AAPL': 'Strategy2_APPLE', 'MSFT':'Strategy2_MICROSOFT'}}

我已经构建了一个包含属于策略 1 或策略 2 的交易列表的数据框,并制作了一个包含该信息的列。然后我要做的是将字典中的值映射到基于顶级键(即 strategy1 或 strategy2)和嵌套键(即 AAPL 或 MSFT)的新列。这样每一笔交易都伴随着数据框同一行中的正确策略和代码。

因此,具有 Strategy1 和 AAPL 的数据框中的一行在新列中获得了 Strategy1_APPLE 的值,但 Strategy2 和 AAPL 获得了 Strategy2_APPLE。

我一直在玩 map() 和一堆 lambda 函数,但我无法让它工作。我认为这是可能的,而无需执行一堆丑陋的循环和 if 语句,我真的可以在这里使用一些帮助来了解如何做到这一点。

编辑:示例

所以它目前看起来像这样
  ticker Strategies
1   AAPL  Strategy1
2   MSFT  Strategy1
3   MSFT  Strategy2
4   AAPL  Strategy1
5   MSFT  Strategy2

和想要的结果是这样的
  ticker Strategies          substrategy
1   AAPL  Strategy1      Strategy1_APPLE
2   MSFT  Strategy1  Strategy1_MICROSOFT
3   MSFT  Strategy2  Strategy2_MICROSOFT
4   AAPL  Strategy1      Strategy1_APPLE
5   MSFT  Strategy2  Strategy2_MICROSOFT

请注意,连接字符串或类似的东西不适用于我的实际问题,其中策略名称要复杂得多

最佳答案

使用方法:

def get_substrategy(t,s):
    v = mydict[s][t]
    return v
然后应用 lambda:
df['substrategy'] = df.apply(lambda x: get_substrategy(x['ticker'], x['Strategies']), axis=1)
想要的结果
   ticker   Strategies  substrategy
1   AAPL    Strategy1   Strategy1_APPLE
2   MSFT    Strategy1   Strategy1_MICROSOFT
3   MSFT    Strategy2   Strategy2_MICROSOFT
4   AAPL    Strategy1   Strategy1_APPLE
5   MSFT    Strategy2   Strategy2_MICROSOFT
注意:如果策略/代码不存在,请确保在您的函数中尝试 catch
注2:不带功能:
df['substrategy'] = df.apply(lambda x: mydict[x['Strategies']][x['ticker']], axis=1)
但您需要考虑策略/代码不存在的情况。

关于python - 如何使用嵌套字典映射数据框中的列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60022339/

10-16 02:11