python-数据分析-Pandas-5、DataFrame-index
Index类型,它为Series和DataFrame对象提供了索引服务,有了索引我们就可以排序数据(sort_index方法)、对齐数据(在运算和合并数据时非常重要)并实现对数据的快速检索(索引运算)。
由于DataFrame类型表示的是二维数据,所以它的行和列都有索引,分别是index和columns。Index类型的创建的比较简单,通常给出data、dtype和name三个参数即可,分别表示作为索引的数据、索引的数据类型和索引的名称。
由于Index本身也是一维的数据,索引它的方法和属性跟Series非常类似
# -*- coding: utf-8 -*-
#index
import pandas
import numpy
#范围索引
#范围索引是由具有单调性的整数构成的索引,我们可以通过RangeIndex构造器来创建范围索引,
# 也可以通过RangeIndex类的类方法from_range来创建范围索引
sales_data= numpy.random.randint(400, 1000, 12)
index = pandas.RangeIndex(1, 13, name='月份')
ser = pandas.Series(data=sales_data, index=index)
print(ser)
'''
月份
1 729
2 676
3 548
4 527
5 949
6 502
7 947
8 579
9 633
10 454
11 498
12 843
dtype: int32
'''
#分类索引
#分类索引是由定类尺度构成的索引。如果我们需要通过索引将数据分组,然后再进行聚合操作,分类索引就可以派上用场
#分类索引还有一个名为reorder_categories的方法,可以给索引指定一个顺序,分组聚合的结果会按照这个指定的顺序进行呈现
sales_data = [6, 6, 7, 6, 8, 6]
index = pandas.CategoricalIndex( # 创建分类索引
data=['苹果', '香蕉', '西瓜', '苹果', '西瓜', '香蕉'], # 索引数据
categories=['苹果', '香蕉', '西瓜'], # 指定分类顺序
ordered=True # 指定索引为有序索引
)
ser = pandas.Series(data=sales_data, index=index)
print(ser)
'''
苹果 6
香蕉 6
西瓜 7
苹果 6
西瓜 8
香蕉 6
dtype: int64
'''
#基于索引分组数据,然后使用sum进行求和。
print(ser.groupby(level=0).sum()) # 按索引分组求和 level: 指定分组的索引级别
'''
苹果 12
香蕉 12
西瓜 15
dtype: int64
'''
#指定索引的顺序。
ser.index = index.reorder_categories(['西瓜', '香蕉', '苹果'])
print(ser.groupby(level=0).sum())
'''
西瓜 15
香蕉 12
苹果 12
dtype: int64
'''
print('-------------------------------------------')
#多级索引
#Pandas 中的MultiIndex类型用来表示层次或多级索引。
# 可以使用MultiIndex类的类方法from_arrays、from_product、from_tuples等来创建多级索引,我们给大家举几个例子。
tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')]
index = pandas.MultiIndex.from_tuples(tuples, names=['number', 'color'])
print(index)
'''
MultiIndex([(1, 'red'),
(1, 'blue'),
(2, 'red'),
(2, 'blue')],
names=['number', 'color'])
'''
arrays = [[1, 1, 2, 2], ['red', 'blue', 'red', 'blue']]
index = pandas.MultiIndex.from_arrays(arrays, names=['number', 'color'])
print(index)
'''
MultiIndex([(1, 'red'),
(1, 'blue'),
(2, 'red'),
(2, 'blue')],
names=['number', 'color'])
'''
stu_ids = numpy.arange(1001, 1006)
semisters = ['期中', '期末']
index = pandas.MultiIndex.from_product((stu_ids, semisters), names=['学号', '学期'])
courses = ['语文', '数学', '英语']
scores = numpy.random.randint(60, 101, (10, 3))
df = pandas.DataFrame(data=scores, columns=courses, index=index)
print(df)