pandas DataFrameGroupBy提取多索引子组及索引存在性校验方案
核心原因说明
DataFrameGroupBy对象本身没有loc属性,你之前直接用方括号传索引会报错,是因为GroupBy对象的方括号取值逻辑是选取要计算的列,而非取分组,所以会把你传入的iA、iB当成列名去检索,自然会报列不存在的错误。GroupBy对象获取指定分组的专用方法是get_group()。
问题1:正确检索dfgrouby2对应多索引子组
直接调用分组对象的get_group()方法,传入分组键的元组即可,对应你的场景写法是dfgrouby2.get_group((iA, iB))。
问题2:捕获(iA,iB)索引不存在的情况
提供两种常用实现方案:
方案1:异常捕获(推荐,性能更高,无需提前遍历全部分组)
用try-except捕获get_group()抛出的KeyError即可,完整可运行代码示例:
dfgrouby1 = df1.groupby(['A','B']) dfgrouby2 = df2.groupby(['A','B']) for (iA,iB), eachgroup1 in dfgrouby1: try: eachgroup2 = dfgrouby2.get_group((iA, iB)) except KeyError: # 此处写分组不存在时的处理逻辑,比如跳过、打印提示等 print(f"分组({iA}, {iB})在df2中不存在") continue # 后续对比eachgroup1['C':'Q']与eachgroup2['C':'Q']的逻辑写在这里
方案2:提前判断分组是否存在
如果不想用异常捕获,可以提前提取dfgrouby2的所有分组键存为集合,遍历前先做存在性判断:
# 提前提取dfgrouby2的所有分组键,转成集合可实现O(1)复杂度的存在性判断 group2_keys = set(dfgrouby2.groups.keys()) for (iA,iB), eachgroup1 in dfgrouby1: if (iA, iB) not in group2_keys: print(f"分组({iA}, {iB})在df2中不存在") continue eachgroup2 = dfgrouby2.get_group((iA, iB)) # 后续对比逻辑
内容的提问来源于stack exchange,提问作者DM1
相关产品推荐
相关产品推荐

