如何用Pandas itertuples实现HS1外层HS2内层的双层迭代
用itertuples实现DataFrame的双层分组迭代并生成带默认值的字典
首先,我完全理解你的需求:你有一个以HS1为索引的DataFrame,想要外层按HS1分组,内层按HS2迭代,最终生成带有预设默认值的字典——其中EUR的字典保留指定默认值,USD的字典用DataFrame中的实际值覆盖默认值。
先把你的DataFrame还原出来,方便后续演示:
import pandas as pd # 构造你提供的DataFrame data = { 'HS2': [3, 2, 3], 'EffNotional_UnMG': [-10082.91381, -36253.84938, 78693.86806] } df = pd.DataFrame(data, index=['EUR', 'USD', 'USD']) df.index.name = 'HS1'
接下来我们一步步实现你的需求:
步骤1:定义预设的默认字典模板
先把你想要的默认值定义好,后续会基于这个模板更新实际数据:
# 预设每个HS1对应的默认字典 default_templates = { 'EUR': {'2': 20000.00, '3': 0}, 'USD': {'2': 0, '3': 0} # USD的默认值先设为0,后续用实际值覆盖 }
步骤2:外层按HS1分组,内层用itertuples迭代
我们先通过groupby(level='HS1')按索引HS1分组,然后对每个分组(子DataFrame)用itertuples()迭代内层的每一行,再根据需求更新默认字典:
result_dict = {} # 外层迭代:按HS1分组 for hs1, group_df in df.groupby(level='HS1'): # 复制默认模板,避免修改原模板 current_dict = default_templates[hs1].copy() # 内层迭代:用itertuples遍历当前分组的每一行 for row in group_df.itertuples(): # 把HS2转为字符串,匹配字典的key类型 hs2_key = str(row.HS2) # 根据HS1决定是否覆盖默认值:USD用实际值,EUR保留默认 if hs1 == 'USD': current_dict[hs2_key] = row.EffNotional_UnMG # 如果是EUR,即使有数据也不覆盖默认值,这里可以根据需求调整 # 把处理好的字典存入结果 result_dict[hs1] = current_dict # 输出最终结果 print(result_dict)
运行结果
执行后你会得到期望的输出:
{ 'EUR': {'2': 20000.0, '3': 0}, 'USD': {'2': -36253.84938, '3': 78693.86806} }
补充说明
- 如果你希望EUR的HS2=3也用实际值覆盖默认,只需要去掉
if hs1 == 'USD'的判断,直接执行current_dict[hs2_key] = row.EffNotional_UnMG即可。 itertuples()会返回一个命名元组,你可以通过row.Index获取HS1(索引值),row.HS2和row.EffNotional_UnMG获取对应的列值,非常灵活。
内容的提问来源于stack exchange,提问作者RKG
相关产品推荐
相关产品推荐

