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

Python多索引数组反连接:筛选满足特定条件的ID

Pandas多索引DataFrame筛选:排除特定组合或匹配指定日期

嘿,我来帮你搞定这个Pandas多索引的筛选问题!先从构造示例数据开始,方便咱们一步步演示:

1. 先搭好示例数据

把你给出的表格转换成Pandas多索引DataFrame:

import pandas as pd

data = {
    'id': ['x1', 'x2', 'x2', 'x2', 'x3'],
    'day': ['Sunday', 'Friday', 'Thursday', 'Wednesday', 'Friday'],
    'sum': [37, 183, 61, 28, 32]
}
df = pd.DataFrame(data).set_index(['id', 'day'])

2. 排除特定的(id, day)组合(比如x1+Sunday)

要去掉x1对应Sunday的那一行,有两种实用方法:

方法一:条件取反筛选

用~符号对"x1且Sunday"的条件取反,就能保留所有不符合这个组合的行:

# 筛选出不是x1+Sunday的所有行
filtered_df = df[~((df.index.get_level_values('id') == 'x1') & (df.index.get_level_values('day') == 'Sunday'))]

如果后续要排除多个组合,直接用|(或)连接更多条件就行,比如同时去掉x1+Sunday和x3+Friday:

filtered_df = df[~(
    ((df.index.get_level_values('id') == 'x1') & (df.index.get_level_values('day') == 'Sunday')) |
    ((df.index.get_level_values('id') == 'x3') & (df.index.get_level_values('day') == 'Friday'))
)]

方法二:直接删除指定索引行

如果你明确知道要删的多索引值,直接用drop更简洁:

filtered_df = df.drop(('x1', 'Sunday'))

要删多个组合的话,传一个索引元组的列表就行:

filtered_df = df.drop([('x1', 'Sunday'), ('x3', 'Friday')])

3. 匹配指定日期的ID(比如Sunday、Friday、Wednesday)

想筛选出指定日期的所有行?用isin方法就能轻松实现:

target_days = ['Sunday', 'Friday', 'Wednesday']
filtered_df = df[df.index.get_level_values('day').isin(target_days)]

要是还想同时限制id(比如只留x2的指定日期行),叠加个条件就行:

filtered_df = df[
    (df.index.get_level_values('id') == 'x2') &
    (df.index.get_level_values('day').isin(target_days))
]

内容的提问来源于stack exchange,提问作者user1334824

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:18:27