Pandas多层索引切片:先选两级索引再选列的实现方法
处理MultiIndex DataFrame的索引筛选+列选择问题
嘿,这个需求我之前也碰到过,Pandas里其实有好几种简单的方法能实现,我先把你的示例代码补全(你之前列名那里没写完),然后一步步给你演示:
首先,先把可运行的示例代码写出来:
import numpy as np import pandas as pd # 创建两级MultiIndex a = pd.MultiIndex.from_arrays( np.array([np.repeat([1, 2], 6), np.tile(np.repeat(["a", "b", "c"], 2), 2)] ) ) # 补全列名,生成完整DataFrame df = pd.DataFrame(np.random.randn(12,4), index=a, columns=['col1', 'col2', 'col3', 'col4'])
接下来给你介绍三种常用的实现方式:
方法1:用.loc一步到位(最简洁)
.loc索引器支持直接传入多级索引的筛选条件,同时指定要选择的列,非常高效。
比如你想筛选第一级索引为1、第二级索引为'a'和'b',然后选择col1和col3:
# 元组的每个元素对应一级索引的筛选值,列表表示该级要保留的多个值 filtered_df = df.loc[ ( [1], ['a', 'b'] ), ['col1', 'col3'] ]
如果要筛选第一级索引为1和2、第二级索引为'b'和'c',再选col2和col4,直接修改参数就行:
filtered_df = df.loc[ ( [1,2], ['b','c'] ), ['col2','col4'] ]
方法2:用pd.IndexSlice让逻辑更清晰
当索引层级多、筛选条件复杂时,用IndexSlice能让代码可读性更高:
# 先定义索引切片器 idx = pd.IndexSlice # 筛选第一级索引1/2,第二级索引a/b,选择col2和col4 filtered_df = df.loc[ idx[ [1,2], ['a','b'] ], ['col2','col4'] ]
这种方式还支持条件筛选,比如你想筛选**第一级索引大于1、第二级索引为'b'**的行,再选所有列:
filtered_df = df.loc[ idx[ df.index.get_level_values(0) > 1, 'b' ], : ]
方法3:分步操作(适合初学者理解)
如果你觉得上面的方法有点绕,可以拆成两步:先筛选符合条件的行,再选择特定列:
# 第一步:生成布尔索引,筛选第一级是1、第二级是'a'或'c'的行 index_filter = df.index.get_level_values(0).isin([1]) & df.index.get_level_values(1).isin(['a','c']) temp_df = df[index_filter] # 第二步:选择需要的列 final_df = temp_df[['col1','col4']]
这几种方法都能满足你的需求,你可以根据自己的场景选最顺手的~
内容的提问来源于stack exchange,提问作者viloflo
相关产品推荐
相关产品推荐

