如何优雅访问Pandas生成的嵌套字典元素?
优雅处理嵌套字典的查询需求
你当前的字典是按字段分组的结构,这种结构不利于按合约维度查询,建议先转换为按合约代码分组的结构,后续查询会更直观高效:
original_dict = { 'token': {'NIFTY22SEP2214100PE': '52263_NFO', 'NIFTY22SEP2214050PE': '52249_NFO'}, 'o185': {'NIFTY22SEP2214100PE': True, 'NIFTY22SEP2214050PE': False}, 'underlying': {'NIFTY22SEP2214100PE': 'NIFTY', 'NIFTY22SEP2214050PE': 'NIFTY'}, 'instrument': {'NIFTY22SEP2214100PE': 'OPTIDX', 'NIFTY22SEP2214050PE': 'OPTIDX'}, 'strike': {'NIFTY22SEP2214100PE': 14100, 'NIFTY22SEP2214050PE': 14050} } # 转换为按合约分组的字典 contract_dict = {contract: {field: original_dict[field][contract] for field in original_dict} for contract in original_dict['token']}
转换后的contract_dict结构如下:
{ 'NIFTY22SEP2214100PE': { 'token': '52263_NFO', 'o185': True, 'underlying': 'NIFTY', 'instrument': 'OPTIDX', 'strike': 14100 }, 'NIFTY22SEP2214050PE': { 'token': '52249_NFO', 'o185': False, 'underlying': 'NIFTY', 'instrument': 'OPTIDX', 'strike': 14050 } }
需求1:根据token值'52263_NFO'获取对应的strike
先建立token到合约的反向映射,再通过合约查询strike:
# 建立token到合约的映射 token_to_contract = {v: k for k, v in original_dict['token'].items()} # 查询strike target_token = '52263_NFO' strike_value = original_dict['strike'][token_to_contract[target_token]] # 或用转换后的contract_dict strike_value = contract_dict[token_to_contract[target_token]]['strike']
如果要避免token不存在引发的KeyError,可以添加判断逻辑:
if target_token in token_to_contract: strike_value = contract_dict[token_to_contract[target_token]]['strike'] else: strike_value = None # 或自定义缺失值处理逻辑
需求2:当'o185'对应值为True时,获取指定合约的token值
分两种场景处理:
- 针对指定合约
NIFTY22SEP2214050PE,先判断其o185值,再获取token:
target_contract = 'NIFTY22SEP2214050PE' if original_dict['o185'][target_contract]: token_value = original_dict['token'][target_contract] else: token_value = None # 该合约o185为False时的自定义处理
- 如果要获取所有
o185为True的合约的token值,用字典推导直接生成结果:
true_o185_tokens = {contract: original_dict['token'][contract] for contract, val in original_dict['o185'].items() if val}
用转换后的contract_dict写法更简洁:
true_o185_tokens = {contract: data['token'] for contract, data in contract_dict.items() if data['o185']}
额外优化:直接用Pandas原表查询
既然字典是从Pandas表格生成的,跳过字典转换,直接用Pandas的查询能力是最优雅的方案:
假设原DataFrame名为df,结构如下:
| contract | token | o185 | underlying | instrument | strike |
|---|---|---|---|---|---|
| NIFTY22SEP2214100PE | 52263_NFO | True | NIFTY | OPTIDX | 14100 |
| NIFTY22SEP2214050PE | 52249_NFO | False | NIFTY | OPTIDX | 14050 |
需求1查询:
target_token = '52263_NFO' strike_value = df.loc[df['token'] == target_token, 'strike'].iloc[0]
需求2查询:
target_contract = 'NIFTY22SEP2214050PE' # 判断该合约o185为True时取token if df.loc[df['contract'] == target_contract, 'o185'].iloc[0]: token_value = df.loc[df['contract'] == target_contract, 'token'].iloc[0] else: token_value = None # 获取所有o185为True的合约token true_o185_tokens = df.loc[df['o185'] == True, 'token'].to_dict()
这种方式利用Pandas矢量化查询,无需手动处理嵌套字典,代码简洁且不易出错。
内容的提问来源于stack exchange,提问作者Arun Kamath
相关产品推荐
相关产品推荐

