pandas 笔记004


目录

  • pandas 笔记004
  • 四、索引对象Index和索引的基本操作
  • 1. 索引对象Index
  • 1.1 Series和DataFrame
  • 1.2 索引对象不可变
  • 1.3 常见的Index种类
  • 2. 索引的 一些基本操作
  • 2.1 重新索引 reindex
  • 2.1.1 Series索引
  • 2.1.2 DataFrame索引
  • 2.2 增
  • 2.2.1 Series索引
  • 2.2.2 DataFrame索引
  • 2.3 删
  • 2.3.1 del
  • 2.3.2 drop
  • 2.4 改
  • 2.4.1 Series索引
  • 2.4.2 DataFrame索引
  • 2.5 查
  • 2.5.1 Series索引
  • 2.5.2 DataFrame索引
  • 2.6 高级索引
  • 2.6.1 loc 标签索引
  • 2.6.2 iloc 位置索引


四、索引对象Index和索引的基本操作

import pandas as pd
import numpy as np
1. 索引对象Index
1.1 Series和DataFrame

Series和DataFrame中的索引都是Index对象。

Series:

pd1 = pd.Series(range(5),index = ['A','B','C','D','E']) #通过列表创建Series索引并指定索引名
print(pd1)
print("="*20)
print(type(pd1.index))   #Series是一个索引对象
A    0
B    1
C    2
D    3
E    4
dtype: int64
====================
<class 'pandas.core.indexes.base.Index'>

DataFrame:

pd2 = pd.DataFrame(np.arange(9).reshape(3,3),index=['A','B','C'],columns=['M','N','Q'])  
#通过一个二维数组创建DataFrame索引并指定索引行列名
print(pd2)
print("="*20)
print(type(pd2.index))   #dataframe是一个索引对象
M  N  Q
A  0  1  2
B  3  4  5
C  6  7  8
====================
<class 'pandas.core.indexes.base.Index'>
1.2 索引对象不可变
pd1.index[1] = 2  #报错
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-1226982f94cb> in <module>
----> 1 pd1.index[1] = 2  #报错

F:\Anaconda_all\Anaconda\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
   4275     @final
   4276     def __setitem__(self, key, value):
-> 4277         raise TypeError("Index does not support mutable operations")
   4278 
   4279     def __getitem__(self, key):

TypeError: Index does not support mutable operations
1.3 常见的Index种类
  • Index,索引
  • Int64Index,整数索引
  • MultiIndex,层级索引
  • DatetimeIndex,时间戳类型
2. 索引的 一些基本操作
  • 重新索引
  • 高级索引
2.1 重新索引 reindex
2.1.1 Series索引
ps1 = pd.Series(range(5),index = ['A','B','C','D','E'])
ps1
A    0
B    1
C    2
D    3
E    4
dtype: int64
ps2 = ps1.reindex(['b','A','C','d','E','F']) #重建行索引
print(ps1)   #原Series索引未改变
print("="*30)
print(ps2)   #如果新索引和原索引不同,返回NAN,相同则返回原索引对应的值,和索引顺序无关
A    0
B    1
C    2
D    3
E    4
dtype: int64
==============================
b    NaN
A    0.0
C    2.0
d    NaN
E    4.0
F    NaN
dtype: float64
2.1.2 DataFrame索引
ps3 = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'],columns=['a','b','c','d'])
ps3
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11

重建行索引:

#重建行索引
ps4 = ps3.reindex(['e','B','A'])
print(ps3)    #原DataFrame索引未改变
print("="*20)
print(ps4)
a  b   c   d
A  0  1   2   3
B  4  5   6   7
C  8  9  10  11
====================
     a    b    c    d
e  NaN  NaN  NaN  NaN
B  4.0  5.0  6.0  7.0
A  0.0  1.0  2.0  3.0

重建列索引:

#重建列索引
ps5 = ps3.reindex(columns = ['b','c','q','v'])
print(ps3)     #原DataFrame索引未改变
print("="*20)
print(ps5)
b	c	q	v
A	1	2	NaN	NaN
B	5	6	NaN	NaN
C	9	10	NaN	NaN
2.2 增
2.2.1 Series索引
p1 = pd.Series(range(5),index = ['A','B','C','D','E'])
p1
A    0
B    1
C    2
D    3
E    4
dtype: int64

改变原索引:

#改变原索引
p1['F'] = 9
p1
A    0
B    1
C    2
D    3
E    4
F    9
dtype: int64

不改变原索引:

#创建一个新的索引对象,不改变原索引
s1 = pd.Series({'g':666})
p2 = p1.append(s1)
print(p1)     #原索引不变
print("="*20)
print(p2)
A    0
B    1
C    2
D    3
E    4
F    9
dtype: int64
====================
A      0
B      1
C      2
D      3
E      4
F      9
g    666
dtype: int64
2.2.2 DataFrame索引

增加列

#DataFrame索引
q = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'],columns=['a','b','c','d'])
q
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11

默认改变列,在列最右边新增列,影响原索引

q['t'] = 9      #新增的t列全为 9
print(q)
print("="*20)
q['y'] = [10,12,14]  #指定新增列的值
print(q)
print("="*20)
q['m'] = ['19','32','24']  #指定新增列的值,加引号
print(q)
a  b   c   d  t
A  0  1   2   3  9
B  4  5   6   7  9
C  8  9  10  11  9
====================
   a  b   c   d  t   y
A  0  1   2   3  9  10
B  4  5   6   7  9  12
C  8  9  10  11  9  14
====================
   a  b   c   d  t   y   m
A  0  1   2   3  9  10  19
B  4  5   6   7  9  12  32
C  8  9  10  11  9  14  24

向指定位置新增列(insert)

#向指定位置新增列
u = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'],columns=['a','b','c','d'])
u
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11

insert插入会影响原索引

u.insert(0,'t',2) #在第0列前新增列t作为第0列,值全为2
print(u)   #
print("="*20)
u.insert(1,'r',[6,66,666])  #在第1列前新增列t作为第1列
print(u)
print("="*20)
u.insert(2,'s',['7','77','777'])  #在第2列前新增列t作为第2列
print(u)
t  a  b   c   d
A  2  0  1   2   3
B  2  4  5   6   7
C  2  8  9  10  11
====================
   t    r  a  b   c   d
A  2    6  0  1   2   3
B  2   66  4  5   6   7
C  2  666  8  9  10  11
====================
   t    r    s  a  b   c   d
A  2    6    7  0  1   2   3
B  2   66   77  4  5   6   7
C  2  666  777  8  9  10  11

增加行

#增加行
qt = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'],columns=['a','b','c','d'])
qt
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11

使用标签索引loc

#使用标签索引loc,改变了原索引
qt.loc['D'] = [1,11,111,1111]  #增加行D
qt
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	1	11	111	1111

使用append

row = {'a':6,'b':6,'c':6,'d':6}
qt1 = qt.append(row,ignore_index=True)  #要加上 ignore_index=True语句,(忽略掉原来的行索引名字),否则报错
print(qt)  #原索引不变
print("="*20)
print(qt1)
a   b    c     d
A  0   1    2     3
B  4   5    6     7
C  8   9   10    11
D  1  11  111  1111
====================
   a   b    c     d
0  0   1    2     3
1  4   5    6     7
2  8   9   10    11
3  1  11  111  1111
4  6   6    6     6
2.3 删
2.3.1 del

会改变原索引。

Series

k1 = pd.Series(range(5),index = ['A','B','C','D','E'])
k1
A    0
B    1
C    2
D    3
E    4
dtype: int64
del k1['A'] #删除行
k1
B    1
C    2
D    3
E    4
dtype: int64

DataFrame

k2 = pd.DataFrame(np.arange(12).reshape(3,4),index=['A','B','C'],columns=['a','b','c','d'])
k2
a	b	c	d
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
del k2['b']   #删除列b
k2
a	c	d
A	0	2	3
B	4	6	7
C	8	10	11
2.3.2 drop

不改变原索引,删除后作为一个新的索引对象。

Series

kt1 = pd.Series(range(4),index = ['A','B','C','D'])
kt1
A    0
B    1
C    2
D    3
dtype: int64

删除轴上的一条数据:

#删除轴上的一条数据
kt2 = kt1.drop('A')
print(kt1)  #原索引对象未改变
print("="*20)
print(kt2)
A    0
B    1
C    2
D    3
dtype: int64
====================
B    1
C    2
D    3
dtype: int64

删除多条数据:

#删除多条数据
kt3 = kt1.drop(['A','C'])
print(kt1)  #原索引对象未改变
print("="*20)
print(kt3)
A    0
B    1
C    2
D    3
dtype: int64
====================
B    1
D    3
dtype: int64

DataFrame

tj1 = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
tj1
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15

默认删除行(axis=0)

#默认删除行(axis=0)
tj2 = tj1.drop('B') #删除一行
print(tj1)   #原索引对象未改变
print("="*20)
print(tj2)
print("="*20)
tj3 = tj1.drop(['A','C']) #删除多行
print(tj1)    #原索引对象未改变
print("="*20)
print(tj3)
m   n   o   p
A   0   1   2   3
B   4   5   6   7
C   8   9  10  11
D  12  13  14  15
====================
    m   n   o   p
A   0   1   2   3
C   8   9  10  11
D  12  13  14  15
====================
    m   n   o   p
A   0   1   2   3
B   4   5   6   7
C   8   9  10  11
D  12  13  14  15
====================
    m   n   o   p
B   4   5   6   7
D  12  13  14  15

删除列(axis=1或axis=‘columns’)

#删除列(axis=1或axis='columns')
tj4 = tj1.drop('m',axis=1) #删除一列
print(tj1)
print("="*20)
print(tj4)
print("="*20)
tj5 = tj1.drop(['m','o'],axis='columns') #删除多列
print(tj1)
print("="*20)
print(tj5)
m   n   o   p
A   0   1   2   3
B   4   5   6   7
C   8   9  10  11
D  12  13  14  15
====================
    n   o   p
A   1   2   3
B   5   6   7
C   9  10  11
D  13  14  15
====================
    m   n   o   p
A   0   1   2   3
B   4   5   6   7
C   8   9  10  11
D  12  13  14  15
====================
    n   p
A   1   3
B   5   7
C   9  11
D  13  15

drop()的inplace属性

在原对象上删除,不会返回新对象。

#inplace属性 在原对象上删除,不会返回新对象
bt = pd.Series(range(4),index = ['A','B','C','D'])
bt
A    0
B    1
C    2
D    3
dtype: int64
bt.drop('A',inplace=True)
bt
B    1
C    2
D    3
dtype: int64
2.4 改
2.4.1 Series索引
bpr = pd.Series(range(4),index = ['A','B','C','D'])
bpr
A    0
B    1
C    2
D    3
dtype: int64

标签索引

bpr['A'] = 666  #标签索引
bpr
A    666
B      1
C      2
D      3
dtype: int64

位置索引

bpr[1] = 777  #位置索引
bpr
A    666
B    777
C      2
D      3
dtype: int64
2.4.2 DataFrame索引
tu1 = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
tu1
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15

默认改变列

对象[‘列’]

tu1['p'] = 4   #将p列全改为4
tu1
m	n	o	p
A	0	1	2	4
B	4	5	6	4
C	8	9	10	4
D	12	13	14	4

对象[‘列’]

tu1['n'] = ['2','22','222','2222']
tu1
m	n	o	p
A	0	2	2	4
B	4	22	6	4
C	8	222	10	4
D	12	2222	14	4

对象.列

# 对象.列 : 效果和上面的 对象['列'] 一样
tu1.m = [1,2,3,4]
tu1
m	n	  o	  p
A	1	2	  2	  4
B	2	22	  6	  4
C	3	222	  10  4
D	4	2222  14  4

使用标签索引 loc 修改行

#使用标签索引loc
td1 = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
td1
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15

loc[‘行名’]

td1.loc['A'] = 666  #修改A行,值全为666
td1
m	n	o	p
A	666	666	666	666
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15

修改精确值

#修改一个值
td1.loc['B','p'] = 100  #修改B行p列的值为100
td1
m	n	o	p
A	666	666	666	666
B	4	5	6	100
C	8	9	10	11
D	12	13	14	15
2.5 查
2.5.1 Series索引
cc = pd.Series(range(4),index = ['A','B','C','D'])
cc
A    0
B    1
C    2
D    3
dtype: int64

行索引

cc['A']  #标签索引
0
cc[0]   #位置索引
0

切片索引

#位置切片索引
cc[1:4]  #取左不取右
B    1
C    2
D    3
dtype: int64
#标签切片索引
cc['B':'D']    #左右都取
B    1
C    2
D    3
dtype: int64

不连续索引(两个中括号)

cc[['A','B']] #标签不连续索引
A    0
B    1
dtype: int64
cc[[0,1]]   #位置不连续索引
A    0
B    1
dtype: int64

布尔索引

#满足条件返回True,否则返回False
cc > 2
A    False
B    False
C    False
D     True
dtype: bool

将满足条件(True)的索引对应的值返回

cc[cc>2]   #将满足条件(True)的索引对应的值返回
D    3
dtype: int64
2.5.2 DataFrame索引
red = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
red
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15

列索引

注意:1.默认情况只能取列索引,取行索引报错。2.只能通过索引名字取,不可通过位置索引(如red[0])取值

#1.列索引(默认情况只能取列索引,取行索引报错)
red['n']  #只能通过索引名字取,不可通过位置索引取值
A     1
B     5
C     9
D    13
Name: n, dtype: int32

取多列(可不连续)

#取多列(可不连续)
red[['m','p']]
m	p
A	0	3
B	4	7
C	8	11
D	12	15

取某个值

#取某个值
red['m']['B']  #第一个中括号表示列,第二个中括号表示行
4

切片

#切片
red[1:3]  #获取的是行,获取列需要用到loc高级索引
m	n	o	p
B	4	5	6	7
C	8	9	10	11
2.6 高级索引
  • loc 标签索引
  • iloc 位置索引
  • ix 标签与位置混合索引
2.6.1 loc 标签索引

基于自定义的索引名(标签索引)

Series

ts = pd.Series(range(4),index = ['A','B','C','D'])
ts
A    0
B    1
C    2
D    3
dtype: int64
ts.loc['A':'C']   #Series 中loc和ts['A':'C']的普通标签切片一样(标签切片左右皆取)
A    0
B    1
C    2
dtype: int64

DataFrame

green = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
green
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	15
green.loc['A','m']  #第一行第一列
0
green.loc['A':'C','m':'n']  #第一个参数是行的范围(可以是单行),第二个参数是列的范围(可以是单列)
m	n
A	0	1
B	4	5
C	8	9
2.6.2 iloc 位置索引

作用和loc一样,不过是基于索引编号来索引

Series

lol = pd.Series(range(4),index = ['A','B','C','D'])
lol
A    0
B    1
C    2
D    3
dtype: int64
lol.iloc[1]
1
lol.iloc[1:3] #取左不取右
B    1
C    2
dtype: int64

DataFrame

gto = pd.DataFrame(np.arange(16).reshape(4,4),index=['A','B','C','D'],columns=['m','n','o','p'])
gto
m	n	o	p
A	0	1	2	3
B	4	5	6	7
C	8	9	10	11
D	12	13	14	1
gto.iloc[0,1]  #第一个参数为行,第二个参数为列,这里表示取第一行第二列的值
1

位置切片取左不取右

gto.iloc[1:3,0:3]  #第一个参数为行,第二个参数为列(位置切片取左不取右)
m	n	o
B	4	5	6
C	8	9	10