认识Pandas的10大索引
索引在我们的日常中其实是很常见的,就像:
- 一本书有自己的目录和具体的章节,当我们想找某个知识点,翻到对应的章节即可;
- 也像图书馆中的书籍被分类成文史类、技术类、小说类等,再加上书籍的编号,很快就能够找到我们想要的书籍。
- 外出吃饭点菜的菜单,从主食类、饮料/汤类、凉菜类等,到具体的菜名等,点个菜即可。
因此,基于实际需求出发创建的索引对我们的业务工作具有很强的指导意义。在Pandas中创建合适的索引则能够方便我们的数据处理工作。
官网学习地址:https://pandas.pydata.org/docs/reference/api/pandas.Index.html
下面通过实际案例来介绍Pandas中常见的10种索引,以及如何创建它们。
pd.Index
Index是Pandas中的常见索引函数,通过它能够构建各种类型的索引,其语法为:
1 | pandas.Index( |
导入两个必需的库:
1 | import pandas as pd |
默认的数据类型是int64
In [2]:
1 | # 通过列表来创建 |
Out[2]:
1 | Int64Index([1, 2, 3, 4], dtype='int64') |
在创建的时候,还能够直接指定数据类型:
In [3]:
1 | # 指定索引的数据类型 |
Out[3]:
1 | Float64Index([1.0, 2.0, 3.0, 4.0], dtype='float64') |
在创建的时候指定名称name和数据类型dtype:
In [4]:
1 | # 指定类型和名称 |
Out[4]:
1 | Float64Index([1.0, 2.0, 3.0, 4.0], dtype='float64', name='Peter') |
In [5]:
1 | # 使用list函数生成列表来创建 |
Out[5]:
1 | Index(['A', 'B', 'C', 'D'], dtype='object') |
使用元组来进行创建:
In [6]:
1 |
|
Out[6]:
1 | Index(['a', 'b', 'c', 'd'], dtype='object') |
使用集合来进行创建。集合本身是无序的,所以最终的结果并不一定是按照给定的元素顺序:
In [7]:
1 |
|
Out[7]:
1 | Index(['z', 'x', 'y'], dtype='object') |
pd.RangeIndex
生成一个区间内的索引,主要是基于Python的range函数,其语法为:
1 | pandas.RangeIndex( |
下面通过多个例子来讲解:
In [8]:
1 | pd.RangeIndex(8) # 默认start是0,步长是1 |
默认结果中起始值是0,结束值是8(不包含),步长是1:
Out[8]:
1 | RangeIndex(start=0, stop=8, step=1) |
In [9]:
1 | pd.RangeIndex(0,8) # 指定start和stop |
Out[9]:
1 | RangeIndex(start=0, stop=8, step=1) |
改变步长为2:
In [10]:
1 | pd.RangeIndex(0,8,2) |
Out[10]:
1 | RangeIndex(start=0, stop=8, step=2) |
In [11]:
1 | list(pd.RangeIndex(0,8,2)) |
将结果用list显示出来,没有包含stop的值8:
Out[11]:
1 | [0, 2, 4, 6] |
下面的案例中将步长改成-1:
In [12]:
1 | pd.RangeIndex(8,0,-1) |
Out[12]:
1 | RangeIndex(start=8, stop=0, step=-1) |
In [13]:
1 | list(pd.RangeIndex(8,0,-1)) |
Out[13]:
1 | [8, 7, 6, 5, 4, 3, 2, 1] # 结果中不包含0 |
pd.Int64Index
指定数据类型是int64整型
1 | pandas.Int64Index( |
In [14]:
1 | pd.Int64Index([1,2,3,4]) |
Out[14]:
1 | Int64Index([1, 2, 3, 4], dtype='int64') |
In [15]:
1 | pd.Int64Index([1,2.0,3,4]) # 强制转成int64类型 |
Out[15]:
1 | Int64Index([1, 2, 3, 4], dtype='int64') |
In [16]:
1 | pd.Int64Index([1,2,3,4],name="Peter") |
Out[16]:
1 | Int64Index([1, 2, 3, 4], dtype='int64', name='Peter') |
如果在数据中包含小数则会报错:
In [17]:
1 | # pd.Int64Index([1,2,3,4.4]) # 出现小数则报错 |
pd.UInt64Index
数据类型是无符号的UInt64
1 | pandas.UInt64Index( |
In [18]:
1 | pd.UInt64Index([1, 2, 3, 4]) |
Out[18]:
1 | UInt64Index([1, 2, 3, 4], dtype='uint64') |
In [19]:
1 | pd.UInt64Index([1, 2, 3, 4],name="Tom") # 指定名字 |
Out[19]:
1 | UInt64Index([1, 2, 3, 4], dtype='uint64', name='Tom') |
In [20]:
1 | pd.UInt64Index([1, 2.0, 3, 4],name="Tom") |
Out[20]:
1 | UInt64Index([1, 2, 3, 4], dtype='uint64', name='Tom') |
1 | # 存在小数则报错 |
pd.Float64Index
数据类型是Float64位的浮点型,允许小数出现:
1 | pandas.Float64Index( |
In [22]:
1 | pd.Float64Index([1, 2, 3, 4]) |
Out[22]:
1 | Float64Index([1.0, 2.0, 3.0, 4.0], dtype='float64') |
In [23]:
1 | pd.Float64Index([1.5, 2.4, 3.7, 4.9]) |
Out[23]:
1 | Float64Index([1.5, 2.4, 3.7, 4.9], dtype='float64') |
In [24]:
1 | pd.Float64Index([1.5, 2.4, 3.7, 4.9],name="peter") |
Out[24]:
1 | Float64Index([1.5, 2.4, 3.7, 4.9], dtype='float64', name='peter') |
注意:在Pandas1.4.0的版本中,上面3个函数全部统一成了pd.NumericIndex方法。
pd.IntervalIndex
1 | pd.IntervalIndex( |
新的 IntervalIndex 通常使用interval_range()
函数来进行构造,基本用法:
In [24]:
1 | pd.interval_range(start=0, end=6) |
Out[24]:
1 | IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5], (5, 6]], |
In [25]:
1 | pd.interval_range(start=0, end=6, closed="neither") # 两边都不关闭 |
Out[25]:
1 | IntervalIndex([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)], |
In [26]:
1 | pd.interval_range(start=0, end=6, closed="both") # 两边都关闭 |
Out[26]:
1 | IntervalIndex([[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6]], |
In [27]:
1 | pd.interval_range(start=0, end=6, closed="left") # 左边关闭 |
Out[27]:
1 | IntervalIndex([[0, 1), [1, 2), [2, 3), [3, 4), [4, 5), [5, 6)], |
In [28]:
1 | pd.interval_range(start=0, end=6, name="peter") |
Out[28]:
1 | IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5], (5, 6]], |
pd.CategoricalIndex
1 | pandas.CategoricalIndex( |
在下面的例子中我们以一批衣服的尺码作为模拟数据:
In [29]:
1 | # 指定数据 |
Out[29]:
1 | CategoricalIndex( |
In [30]:
1 | c2 = pd.CategoricalIndex( |
Out[30]:
1 | CategoricalIndex( |
In [31]:
1 | c3 = pd.CategoricalIndex( |
Out[31]:
1 | CategoricalIndex( |
In [32]:
1 | c4 = pd.CategoricalIndex( |
Out[32]:
1 | CategoricalIndex( |
CategoricalIndex 索引对象也可以从 Categorical() 方法进行实例化得到:
In [33]:
1 | c5 = pd.Categorical(["a", "b", "c", "c", "b", "c", "a"]) |
Out[33]:
1 | CategoricalIndex( |
In [34]:
1 | pd.CategoricalIndex(c5, ordered=True) # 指定排序 |
Out[34]:
1 | CategoricalIndex( |
pd.DatetimeIndex
以时间和日期作为索引,通过date_range函数来生成,具体语法为:
1 | pd.DatetimeIndex( |
以时间和日期作为索引,通过date_range函数来生成,具体例子为:
In [35]:
1 | # 默认天为频率 |
Out[35]:
1 | DatetimeIndex( |
In [36]:
1 | # 日期作为索引,D代表天 |
Out[36]:
1 | DatetimeIndex( |
In [37]:
1 | # H代表小时 |
Out[37]:
1 | DatetimeIndex( |
In [38]:
1 | # M代表月 |
Out[38]:
1 | DatetimeIndex( |
In [39]:
1 | # Q代表季度 |
显示的结果中以一个季度-3个月为频率:
Out[39]:
1 | DatetimeIndex( |
In [40]:
1 | # 指定时区tz |
Out[40]:
1 | DatetimeIndex( |
pd.PeriodIndex
pd.PeriodIndex是一个专门针对周期性数据的索引,方便针对具有一定周期的数据进行处理,具体用法如下:
1 | pd.PeriodIndex( |
生成pd.PeriodIndex对象的方式1:指定开始时间、周期频率
In [41]:
1 | pd.period_range('2022-01-01 09:00', periods=5, freq='H') |
Out[41]:
1 | PeriodIndex(['2022-01-01 09:00', '2022-01-01 10:00', '2022-01-01 11:00', |
In [42]:
1 | pd.period_range('2022-01-01 09:00', periods=6, freq='2D') |
Out[42]:
1 | PeriodIndex(['2022-01-01', '2022-01-03', '2022-01-05', '2022-01-07', |
In [43]:
1 | pd.period_range('2022-01', periods=5, freq='M') |
Out[43]:
1 | PeriodIndex(['2022-01', '2022-02', '2022-03', '2022-04', '2022-05'], dtype='period[M]', freq='M') |
In [44]:
1 | p1 = pd.DataFrame( |
生成pd.PeriodIndex对象的方式2:直接使用pd.PeriodIndex
方法
In [45]:
1 | pd.PeriodIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04'], freq = '2H') |
Out[45]:
1 | PeriodIndex(['2022-01-01 00:00', '2022-01-02 00:00', '2022-01-03 00:00', |
In [46]:
1 | pd.PeriodIndex(['2022-01', '2022-02', '2022-03', '2022-04'], freq = 'M') |
Out[46]:
1 | PeriodIndex(['2022-01', '2022-02', '2022-03', '2022-04'], dtype='period[M]', freq='M') |
In [47]:
1 | pd.PeriodIndex(['2022-01', '2022-07'], freq = 'Q') |
Out[47]:
1 | PeriodIndex(['2022Q1', '2022Q3'], dtype='period[Q-DEC]', freq='Q-DEC') |
生成pd.PeriodIndex对象的方式3:利用date_range函数先生成DatetimeIndex对象
In [48]:
1 | data = pd.date_range("2022-01-01",periods=6) |
Out[48]:
1 | DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', |
In [49]:
1 | pd.PeriodIndex(data=data) |
Out[49]:
1 | PeriodIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', |
In [50]:
1 | p2 = pd.DataFrame(np.random.randn(400, 1), |
pd.TimedeltaIndex
1 | pd.TimedeltaIndex( |
创建方式1:指定数据和最小单元
In [51]:
1 | pd.TimedeltaIndex([12, 24, 36, 48], unit='s') |
Out[51]:
1 | TimedeltaIndex( |
In [52]:
1 | pd.TimedeltaIndex([1, 2, 3, 4], unit='h') # 按小时 |
Out[52]:
1 | TimedeltaIndex( |
In [53]:
1 | pd.TimedeltaIndex([12, 24, 36, 48], unit='h') |
Out[53]:
1 | TimedeltaIndex( |
In [54]:
1 | pd.TimedeltaIndex([12, 24, 36, 48], unit='D') |
Out[54]:
1 | TimedeltaIndex( |
创建方式2:通过timedelta_range函数来间接生成
In [55]:
1 | data1 = pd.timedelta_range(start='1 day', periods=4) |
Out[55]:
1 | TimedeltaIndex(['1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq='D') |
In [56]:
1 | pt1 = pd.TimedeltaIndex(data1) |
Out[56]:
1 | TimedeltaIndex( |
In [57]:
1 | data2 = pd.timedelta_range(start='1 day', end='3 days', freq='6H') |
Out[57]:
1 | TimedeltaIndex( |
In [58]:
1 | pt2 = pd.TimedeltaIndex(data2) |
Out[58]:
1 | TimedeltaIndex( |