Pandas多层索引筛选首次组合并保留全部索引值方法
多层索引DataFrame保留首次出现的IDX1+IDX2配对全量行
问题原因
你之前使用的df_tst = df.groupby(level=[0,2]).first()无法得到正确结果,核心问题有两个:
- 分组键选择错误:
level=[0,2]对应索引层级是IDX1和DATE,未将IDX2纳入分组键,导致IDX2被当做值列聚合,直接丢失索引层级 - 聚合逻辑不符合需求:
first()只会返回每个分组的第一行数据,无法保留有效配对下所有日期维度的行
你的实际需求是:按原始顺序筛选(IDX1, IDX2)配对,只要配对中的IDX1或IDX2已经在之前的有效配对中出现过,就丢弃该配对及对应的所有行;保留下来的有效配对,需要完整保留其下所有DATE维度的行,最终结果与给出的df_desired完全一致。
实现代码
import pandas as pd # 原始数据加载 data = \ [['31/01/2021','A','X',10,15], ['28/02/2021','A','X',20,30], ['31/03/2021','A','X',30,45], ['31/01/2021','B','Y',20,15], ['28/02/2021','B','Y',20,15], ['31/03/2021','B','Y',30,30], ['31/01/2021','C','Z',40,45], ['28/02/2021','C','Z',50,55], ['31/03/2021','C','Z',60,65], ['31/01/2021','C','Q',40,45], ['28/02/2021','C','Q',50,55], ['31/03/2021','C','Q',60,65], ['31/01/2021','D','Y',20,15], ['28/02/2021','D','Y',20,15], ['31/03/2021','D','Y',30,30]] df=pd.DataFrame(data) df.columns = ['DATE','IDX1','IDX2','VAR1','VAR2'] df['DATE'] = pd.to_datetime(df['DATE']) df.set_index(['IDX1','IDX2','DATE'], inplace=True) # 核心处理逻辑 # 1. 按原始顺序提取所有不重复的(IDX1, IDX2)配对 all_pairs = df.index.droplevel(2).drop_duplicates(keep='first') # 2. 筛选首次出现、无重复IDX1/IDX2值的有效配对 used_idx1 = set() used_idx2 = set() valid_pairs = [] for idx1, idx2 in all_pairs: if idx1 not in used_idx1 and idx2 not in used_idx2: valid_pairs.append((idx1, idx2)) used_idx1.add(idx1) used_idx2.add(idx2) # 3. 筛选原数据,保留有效配对下的所有行 df_result = df[df.index.droplevel(2).isin(valid_pairs)]
结果说明
执行代码后df_result的输出与期望的df_desired结构、数值完全一致,三层索引IDX1/IDX2/DATE完整保留:有效配对(A,X)、(B,Y)、(C,Z)下的所有日期行全部留存,重复IDX1对应的(C,Q)、重复IDX2对应的(D,Y)行全部被剔除。
内容的提问来源于stack exchange,提问作者Rutger
相关产品推荐
相关产品推荐

