pandas.DataFrame.xs 是用于跨层次索引访问(cross-section)的函数。可以通过指定行或列标签在DataFrame的行或列中进行切片操作,特别是对于多级索引(MultiIndex)非常有用。本文主要介绍一下Pandas中pandas.DataFrame.xs方法的使用。

DataFrame.xs(key, axis=0, level=None, drop_level=True)

返回Series/DataFrame的横截面(cross-section)
该方法使用一个关键参数来选择多索引特定级别的数据。

参数:

key labeltuplelabel

label包含在索引中,或部分包含在多索引中。

axis : {0 或 ‘index’, 1 或 ‘columns’}, 默认 0

轴上检索横截面(cross-section)。

level : object,默认为前n层(n=1len(key))

如果key部分包含在多索引中,请指示使用了哪些级别。

级别可以通过label 或 position来引用。

drop_level : bool, 默认True

如果为False,返回与自己级别相同的对象。

返回:

SeriesDataFrame

与所选索引级别对应的原始Series

DataFrame的横截面(cross-section)。

注意

xs不能用于设置值。
多索引切片器是在任何级别上获取/设置值的通用方法。它是xs功能的超集,参见MultiIndex Slicers

例子,

1)单层索引

import pandas as pd

# 创建一个示例 DataFrame
data = {
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['row1', 'row2', 'row3'])

# 使用 xs 获取指定行
row = df.xs('row2')
print("指定行:\n", row)
# 输出:
# A    2
# B    5
# C    8
# Name: row2, dtype: int64

2)多级索引

import pandas as pd

# 创建一个带有多级索引的行索引的 DataFrame
arrays = [
    ['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
    ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']
]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
df = pd.DataFrame({'A': range(8), 'B': range(8, 16)}, index=index)

# 显示原始的带有多级索引的 DataFrame
print("Original DataFrame with MultiIndex:\n", df)

# 使用 xs 获取多级索引中指定级别的行
level_row = df.xs('bar', level='first')
print("\n多级索引中指定级别的行:\n", level_row)

# 获取多级索引中指定级别的行和列的值
specific_value = df.xs(('bar', 'one'))
print("\n多级索引中指定级别的行和列的值:\n", specific_value)

# 创建一个带有多级索引的列索引的 DataFrame
columns = pd.MultiIndex.from_tuples([('A', 'one'), ('B', 'two')], names=['col1', 'col2'])
df_multi_col = pd.DataFrame(df.values, index=index, columns=columns)

# 显示带有多级索引的列索引的 DataFrame
print("\nDataFrame with MultiIndex columns:\n", df_multi_col)

# 使用 xs 获取多级索引中指定级别的列
level_col = df_multi_col.xs('one', level='col2', axis=1)
print("\n多级索引中指定级别的列:\n", level_col)

3)使用示例

import pandas as pd

# 创建一个示例 DataFrame
d = {
    'num_legs': [4, 4, 2, 2],
    'num_wings': [0, 0, 2, 2],
    'class': ['mammal', 'mammal', 'mammal', 'bird'],
    'animal': ['cat', 'dog', 'bat', 'penguin'],
    'locomotion': ['walks', 'walks', 'flies', 'walks']
}
df = pd.DataFrame(data=d)
df = df.set_index(['class', 'animal', 'locomotion'])

# 对多级索引进行排序
df = df.sort_index()

# 显示设置多级索引并排序后的 DataFrame
print("Original DataFrame with MultiIndex:\n", df)

# 获取指定索引处的值
mammal_df = df.xs('mammal')
print("\nValues at 'mammal' index:\n", mammal_df)

# 获取多个索引处的值
mammal_dog_df = df.xs(('mammal', 'dog'))
print("\nValues at ('mammal', 'dog') index:\n", mammal_dog_df)

# 获取指定索引和级别(level)的值
cat_df = df.xs('cat', level=1)
print("\nValues at 'cat' level=1 index:\n", cat_df)

# 获取多个索引和级别的值
bird_walks_df = df.xs(('bird', 'walks'), level=[0, 'locomotion'])
print("\nValues at ('bird', 'walks') level=[0, 'locomotion'] index:\n", bird_walks_df)

# 获取指定列和轴上的值
num_wings_series = df.xs('num_wings', axis=1)
print("\nValues of 'num_wings' column:\n", num_wings_series)

推荐文档

相关文档

大家感兴趣的内容

随机列表