如何使用嵌套字典在数据框中映射列?

时间:2020-02-02 00:37:46

标签: python pandas dictionary

我为某些交易策略创建了此嵌套词典,例如:

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

我已经用一个属于strategy1或strategy2的交易列表构建了一个数据框,并在其中列了该信息。然后我想做的是基于顶级键(即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

请注意,连接字符串或类似内容对我的实际问题不起作用,因为我的实际问题是底层名称要复杂得多

4 个答案:

答案 0 :(得分:3)

我将使用reindex + MultiIndexd是您的dict

df['New']=pd.DataFrame(d).stack().reindex(pd.MultiIndex.from_frame(df)).values
df
  ticker Strategies                  New
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

答案 1 :(得分:1)

使用一种方法:

def get_substrategy(t,s):    
    v = mydict[s][t] 
    return v

然后应用lambda:

df['substrategy'] = df.apply(lambda x: foo(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

注意:请确保在策略/股票代码不存在的情况下尝试捕获功能

Note2:不带功能:

df['substrategy'] = df.apply(lambda x: mydict[x['Strategies']][x['ticker']], axis=1)

,但是您需要考虑不存在策略/股票代号的情况。

答案 2 :(得分:1)

在这里,使用pandas.DataFrame构造函数的另一种方法是重塑和merge

d1 = (pd.DataFrame(d).rename_axis(index='ticker',columns='Strategies')
                     .stack()
                     .rename('substrategy')
                     .reset_index())
df.merge(d1)

输出:

|    | ticker   | Strategies   | substrategy         |
|---:|:---------|:-------------|:--------------------|
|  0 | AAPL     | Strategy1    | Strategy1_APPLE     |
|  1 | AAPL     | Strategy1    | Strategy1_APPLE     |
|  2 | MSFT     | Strategy1    | Strategy1_MICROSOFT |
|  3 | MSFT     | Strategy2    | Strategy2_MICROSOFT |
|  4 | MSFT     | Strategy2    | Strategy2_MICROSOFT |

答案 3 :(得分:0)

如果数据帧是您的目标,我建议您寻求一种更好的存储数据的方法。要将现有结构转换为对数据框更友好的格式(并实现所需的目标数据框):

import pandas as pd

# input nested dict in OP
source_dict = {'Strategy1' :{'AAPL':'Strategy1_APPLE', 'MSFT':'Strategy1_MICROSOFT'}, 'Strategy2' :{'AAPL': 'Strategy2_APPLE', 'MSFT':'Strategy2_MICROSOFT'}}
tmp_rows = []

# convert nested-dict to pandas friendly input format
for strategy in source_dict.keys():
    for ticker in source_dict[strategy].keys():
        substrategy = source_dict[strategy][ticker]
        tmp_rows.append({'ticker': ticker, 'Strategies': strategy, 'substrategy': substrategy})

# create output dataframe
output_dataframe = pd.DataFrame(tmp_rows)

print(output_dataframe.head(10))
相关问题