Pandas 如何在 MultiIndex 索引中查询列值
在本文中,我们将介绍如何在 Pandas 的 MultiIndex 索引中查询列值。MultiIndex 索引是 Pandas 中的一种高级索引技术,它允许在一个表格或 DataFrame 中使用多个索引级别。使用 MultiIndex 索引,您可以轻松地跨多个索引级别进行数据筛选、重塑和数据透视。
对于 MultiIndex 索引,我们通常使用 pd.MultiIndex.from_arrays
、pd.MultiIndex.from_tuples
或 pd.MultiIndex.from_product
等函数来构建 MultiIndex 对象。其中 pd.MultiIndex.from_product
函数将多个数组的笛卡尔积作为多层索引,如下所示:
import pandas as pd
df = pd.DataFrame({'key1': ['A', 'A', 'B', 'B', 'C', 'C'],
'key2': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'data': [1, 2, 3, 4, 5, 6]})
multi_index = pd.MultiIndex.from_product([df['key1'].unique(), df['key2'].unique()], names=['key1', 'key2'])
df = df.set_index(['key1', 'key2']).reindex(multi_index)
这段代码将 DataFrame
创建为:
data
key1 key2
A X 1
Y 2
B X 3
Y 4
C X 5
Y 6
现在我们来看看如何在 MultiIndex 索引中进行查询。
阅读更多:Pandas 教程
使用 loc 或索引方法查询
在 MultiIndex 索引中,您可以使用 loc
或其他索引方法来查询列值。例如,如果您想获取索引为 B
和 Y
的行的所有列的值,可以使用以下代码:
print(df.loc[('B', 'Y')])
输出:
data 4
Name: (B, Y), dtype: int64
如果您只需要获取某列的值,可以使用以下代码:
print(df.loc[('B', 'Y'), 'data'])
输出:
4
使用 xs 方法查询
除了使用 loc 或其他索引方法以外,您还可以使用 Pandas 中的 xs(cross-section)方法来查询跨越多个层级的数据。xs 方法将从索引的指定级别返回交叉部分,如下所示:
print(df.xs('Y', level='key2'))
输出:
data
key1
A 2
B 4
C 6
使用 xs 方法查询多个交叉部分
如果您需要同时查询多个交叉部分,则可以传递一个元组的列表。例如,如果您想获取 key1
列为 A
和 C
且 key2
列为 Y
的行的所有列的值:
print(df.xs(('A', 'C'), level='key1'))
输出:
data
key2
X 1
Y 2
这个方法的优势在于您可以传递一个元组来指定任意数量的层级,而不仅仅是两个层级。
使用 Query 方法查询
Pandas 还通过 query
方法提供了一种检索多个层级的快捷方式。该方法接收一个查询字符串,查询字符串中使用 @
符号指代索引的级别,示例如下:
print(df.query("key1 == 'B' and key2 == 'Y'"))
输出:
data
key1 key2
B Y 4
总结
在本文中,我们介绍了几种在 Pandas MultiIndex 索引中查询列值的方法。使用以上方法,您可以轻松地筛选、重塑和数据透视 MultiIndex 数据。无论您需要查询单个交叉部分还是多个交叉部分,还是使用 query
方法,都可以快速有效地完成任务。希望这些技巧能够帮助您更好地利用 Pandas 中的 MultiIndex 索引。