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 方法来选择多级索引数据帧中的数据。在实际的数据分析和统计中,掌握这些方法能够帮助我们更有效地处理多级索引数据帧,从而获得更好的结果。