我为某些交易策略创建了此嵌套词典,例如:
{'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
请注意,连接字符串或类似内容对我的实际问题不起作用,因为我的实际问题是底层名称要复杂得多
答案 0 :(得分:3)
我将使用reindex
+ MultiIndex
,d
是您的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))