You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅访问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值

分两种场景处理:

  1. 针对指定合约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时的自定义处理
  1. 如果要获取所有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,结构如下:

contracttokeno185underlyinginstrumentstrike
NIFTY22SEP2214100PE52263_NFOTrueNIFTYOPTIDX14100
NIFTY22SEP2214050PE52249_NFOFalseNIFTYOPTIDX14050

需求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 12:15:39