Python Pandas – 从数组创建多级索引

Python Pandas – 从数组创建多级索引

当我们处理数据分析和统计时,有时我们需要给数据框添加多级索引。Pandas 提供了一种很好的方式来处理这种情况,那就是从数组或列表中创建多级索引。

创建多级索引

我们可以使用 Pandas 中的 MultiIndex 类来创建多级索引。创建多级索引的基本形式如下所示:

import pandas as pd

# 创建多级索引
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': [1, 2, 3, 4, 5, 6, 7, 8],
                   'B': [10, 20, 30, 40, 50, 60, 70, 80],
                   'C': [100, 200, 300, 400, 500, 600, 700, 800],
                   'D': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000]},
                  index=index)

print(df)

上面的代码中,我们首先使用数组创建了一个包含两个层级的多级索引,其中第一层次为 ‘bar’、’baz’、’foo’ 和 ‘qux’,第二层次为 ‘one’ 和 ‘two’。然后我们使用这个多级索引创建了一个数据框,其中每个元素都有四个属性 A、B、C 和 D。

运行上面的代码可以得到下面的输出:

               A   B    C     D
first second                 
bar   one      1  10  100  1000
      two      2  20  200  2000
baz   one      3  30  300  3000
      two      4  40  400  4000
foo   one      5  50  500  5000
      two      6  60  600  6000
qux   one      7  70  700  7000
      two      8  80  800  8000

这里可以看到,每一行数据都有两个层级的索引。第一层级的索引是 ‘bar’、’baz’、’foo’ 和 ‘qux’,第二层级的索引是 ‘one’ 和 ‘two’。

另外,我们还可以使用 MultiIndex 中的 from_tuples() 方法或 from_product() 方法来创建多级索引。下面是一个使用 from_tuples() 方法创建多级索引的示例代码:

import pandas as pd

# 使用 from_tuples() 方法创建多级索引
tuples = [('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two'),
          ('foo', 'one'), ('foo', 'two'), ('qux', 'one'), ('qux', 'two')]

index = pd.MultiIndex.from_tuples(tuples, names=('first', 'second'))

# 创建数据框
df = pd.DataFrame({'A': [1, 2, 3, 4, 5, 6, 7, 8],
                   'B': [10, 20, 30, 40, 50, 60, 70, 80],
                   'C': [100, 200, 300, 400, 500, 600, 700, 800],
                   'D': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000]},
                  index=index)

print(df)

上面的代码中,我们首先使用元组创建了一个包含两个层级的多级索引,其中第一层次为 ‘bar’、’baz’、’foo’ 和 ‘qux’,第二层次为 ‘one’ 和 ‘two’。然后我们使用这个多级索引创建了一个数据框,其中每个元素都有四个属性 A、B、C 和 D。

运行上面的代码可以得到与上面相同的输出。

查询多级索引

在使用多级索引的数据框时,我们通常需要对其进行查询操作。Pandas 提供了多种方法来查询多级索引数据帧。

loc 和 iloc

对于多级索引数据帧,我们可以使用 loc 和 iloc 方法按照行和列的位置来选择数据。loc 方法中第一个参数是行的选择条件,第二个参数是列的选择条件。ilco 方法中与 loc 方法相同。

下面是一个示例代码:

import pandas as pd

# 创建多级索引
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': [1, 2, 3, 4, 5, 6, 7, 8],
                   'B': [10, 20, 30, 40, 50, 60, 70, 80],
                   'C': [100, 200, 300, 400, 500, 600, 700, 800],
                   'D': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000]},
                  index=index)

# 使用 loc 方法选择数据
print(df.loc[('bar', 'two'), 'C'])

# 使用 iloc 方法选择数据
print(df.iloc[1, 2])

上面的代码中,我们首先创建了一个包含两个层级的多级索引的数据帧。然后我们使用 loc 和 iloc 方法选择数据。loc 方法中的第一个参数为行索引,第二个参数为列索引。iloc 方法中的两个参数分别为行号和列号。

运行上面的代码可以得到以下输出:

200
200

这里可以看到,我们分别使用 loc 和 iloc 方法选择了数据帧中 ‘bar’、’two’ 行和 ‘C’ 列的元素,输出结果都是 200。

xs 方法

我们可以使用 xs 方法从多级索引的数据帧中选择数据。

xs 方法与 loc 和 iloc 方法类似,但 xs 方法不需要指定每个层级的索引。如果其中一些层级的索引是唯一的,我们可以直接使用 xs 方法选择数据。

下面是一个示例代码:

import pandas as pd

# 创建多级索引
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': [1, 2, 3, 4, 5, 6, 7, 8],
                   'B': [10, 20, 30, 40, 50, 60, 70, 80],
                   'C': [100, 200, 300, 400, 500, 600, 700, 800],
                   'D': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000]},
                  index=index)

# 使用 xs 方法选择数据
print(df.xs('two', level='second'))

上面的代码中,我们首先创建了一个包含两个层级的多级索引的数据帧。然后我们使用 xs 方法选择了第二个层级索引为 ‘two’ 的所有行。

运行代码可以得到以下输出:

       A   B    C     D
first                 
bar    2  20  200  2000
baz   4  40  400  4000
foo    6  60  600  6000
qux    8  80  800  8000

这里可以看到,我们使用 xs 方法选择了第二个层级索引为 ‘two’ 的所有行。注意,在使用 xs 方法时,我们需要指定层级的名字或者编号,这里我们指定了第二个层级的名字为 ‘second’。

query 方法

我们还可以使用 query 方法根据条件来选择数据。

query 方法中第一个参数是条件字符串,需要满足 Python 的语法规则。在条件字符串中,我们可以使用括号来表示层级索引,冒号来表示整个索引层级,逗号来表示并列的索引层级。另外,我们可以使用 @ 符号来表示一个变量或常量。

下面是一个示例代码:

import pandas as pd

# 创建多级索引
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': [1, 2, 3, 4, 5, 6, 7, 8],
                   'B': [10, 20, 30, 40, 50, 60, 70, 80],
                   'C': [100, 200, 300, 400, 500, 600, 700, 800],
                   'D': [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000]},
                  index=index)

# 使用 query 方法选择数据
print(df.query('first=="bar" and second=="two" and C>150'))

上面的代码中,我们使用 query 方法选择了第一层级索引为 ‘bar’、第二层级索引为 ‘two’、并且 ‘C’ 列大于 150 的行。

运行代码可以得到以下输出:

               A   B    C     D
first second                 
bar   two      2  20  200  2000

这里可以看到,我们使用 query 方法选择了第一层级索引为 ‘bar’、第二层级索引为 ‘two’、并且 ‘C’ 列大于 150 的行。

结论

本文介绍了如何使用 Pandas 中的 MultiIndex 类来从数组创建多级索引数据帧,并演示了如何使用 loc、iloc、xs 和 query 方法来选择多级索引数据帧中的数据。在实际的数据分析和统计中,掌握这些方法能够帮助我们更有效地处理多级索引数据帧,从而获得更好的结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程