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
相关产品推荐
相关产品推荐

