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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:36:21