pandas笔记(4)——DataFrame索引设置

在Python中,dataframe可以使用默认行列索引,也可以自行设置索引。

查看索引

新建一个DataFrame

import pandas as pd
df = pd.DataFrame ([['a','A'],['b','B'],['c','C']],index=[1,2,3],columns=['小写','大写'])
df

# 返回

	小写	大写
1	a		A
2	b		B
3	c		C
  • 获取列索引
# 获取列索引
df.columns  

# 返回
Index(['小写', '大写'], dtype='object')
  • 获取行索引
# 获取行索引
df.index

# 返回
Int64Index([1, 2, 3], dtype='int64')

行、列索引的修改

对于DataFrame,如果需要对索引进行修改,可以通过 index 和 columns 参数来进行操作,也可以通过 rename() 方式实现。

  • 修改行索引:index
# 将行索引改变为一二三
df.index = list("一二三")
df

# 返回

	小写	大写
一	a		A
二	b		B
三	c		C
  • 修改列索引:columns
# 将列索引改为l,u
df.columns = list('lu')
df

# 返回
	l	u
一	a	A
二	b	B
三	c	C
  • rename()方法
    格式:df.rename(索引参数={},inplace = False/True)
    其中inplace参数为False时,不修改原数据,为True时,会对原数据修改。默认False

示例:将 df 的行索引变为123,列索引变为“小写”,“大写”,并将修改结果返回给 df

df.rename(index = {
     "一":1,"二":2,"三":3},columns = {
     "l":"小写","u":"大写"},inplace = True)
df

# 返回
	小写	大写
1	a		A
2	b		B
3	c		C

将数据列设置为索引列

  • 将列转化为索引
    在创建好一个DataFrame后,可以通过 set_index() 方法将其中的一列或多列设置为索引列。
    格式:df.set_index(keys, drop, append, inplace)
    参数:
    keys:设置为索引的列名称
    drop:是否删除被设为索引的列,默认True(删除)。
    append:是否将新索引列附加到旧索引列上,默认False(不附加)
    inplace:是否修改原数据,默认False(不修改)
'''创建一个df,并按照A列排序'''
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(16).reshape((4,4)),index = list('abcd'),columns=['A','B','C','D'])
df['rank']=df['A'].rank(method='first')
df

# 返回
	A	B	C	D	rank
a	0	1	2	3	1.0
b	4	5	6	7	2.0
c	8	9	10	11	3.0
d	12	13	14	15	4.0


'''将rank设为新的索引'''
df.set_index('rank')

# 返回

		A	B	C	D
rank				
1.0		0	1	2	3
2.0		4	5	6	7
3.0		8	9	10	11
4.0		12	13	14	15

'''设置多层次索引'''
df.set_index(['A','B'])

# 返回

		C	D	rank
A	B			
0	1	2	3	1.0
4	5	6	7	2.0
8	9	10	11	3.0
12	13	14	15	4.0


'''对比drop参数'''
df.set_index('rank',drop=False)

# 返回

		A	B	C	D	rank
rank					
1.0		0	1	2	3	1.0
2.0		4	5	6	7	2.0
3.0		8	9	10	11	3.0
4.0		12	13	14	15	4.0


'''对比append参数'''
df.set_index('rank',append=True)

# 返回

			A	B	C	D
	rank				
a	1.0		0	1	2	3
b	2.0		4	5	6	7
c	3.0		8	9	10	11
d	4.0		12	13	14	15

  • 将索引转化为列
    reset_index()方法可以将索引重新转化为列
    格式:reset_index(level, drop, inplace)
    参数:
    level:用于指定要将层次化索引的第几层转化为columns,第一个索引为0级,第二个为1级,默认为None(全部索引)。
    drop:是否删除索引列,默认False。
    inplace:是否修改原数据,默认False(不修改)
# 创建一个df_reset
df_set = df.set_index(["A","B"])
df_set

# 返回

		C	D	rank
A	B			
0	1	2	3	1.0
4	5	6	7	2.0
8	9	10	11	3.0
12	13	14	15	4.0


# 将A、B索隐列重新转化为列
df_reset = df_set.reset_index(['A','B'])
df_reset

# 返回

	A	B	C	D	rank
0	0	1	2	3	1.0
1	4	5	6	7	2.0
2	8	9	10	11	3.0
3	12	13	14	15	4.0

索引切片

DataFrame可以对行,列通过索引进行切片处理。
注意:在pandas、numpy中,切片的结果是产生一个视图,对切片数据进行修改后,会影响到原始数据。(但在list 中进行切片产生的是copy副本)

# 新建一个DataFrame
import pandas as pd
import  numpy as np
df1 = pd.DataFrame(np.arange(16).reshape((4,4)),index = [1,2,3,4],columns=['A','B','C','D'])
df1

# 返回

	A	B	C	D
1	0	1	2	3
2	4	5	6	7
3	8	9	10	11
4	12	13	14	15
  • 选取单列
    传入需要提取的列名
df1["A"]

# 返回
1     0
2     4
3     8
4    12
Name: A, dtype: int32
  • 选取多列
    将需要的列名,以列表的形式传入
df1[["A",'B']]

# 返回
	A	B
1	0	1
2	4	5
3	8	9
4	12	13
  • 选取单行
    传入所需行号
df1[2:3]

# 返回	
    A	B	C	D
3	8	9	10	11
  • 选取多行
    和选取单行方法一样(强迫症0.0)
df1[:3]

# 返回	

    A	B	C	D
1	0	1	2	3
2	4	5	6	7
3	8	9	10	11
  • 按条件选取行
    感觉这个方法只适用单列单条件情景,还是推荐使用pandas中的loc函数
df1[df1["A"]>5]

# 返回
	A	B	C	D
3	8	9	10	11
4	12	13	14	15
  • 切片产生的是个视图,修改切片会影响原始数据
    (下面有两个需要注意的地方)
# 对 df1 的A列进行切片,并赋值给 t ,此时 t 是 df1 的一个视图,对 t 修改,会另 df1 产生变化。
import pandas as pd
import  numpy as np
df1 = pd.DataFrame(np.arange(16).reshape((4,4)),index = [1,2,3,4],columns=['A','B','C','D'])
print(df1)

t = df1["A"]
t[1] = 100   # 注意: 由于已经设置了索引,这里就是t[1],而不是t[0]
df1

# 返回
 	A   B   C   D
1   0   1   2   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15

	A	B	C	D
1	100	1	2	3
2	4	5	6	7
3	8	9	10	11
4	12	13	14	15

# 需要注意的是,如果想要对 t 整体修改,需要以 t 的切片来完成
# 注意: 如果写成 t = [0,0,0,0]则是对 t 重新进行了赋值
t[:] = [0,0,0,0]
print(df1) 
 	A   B   C   D
1  0   1   2   3
2  0   5   6   7
3  0   9  10  11
4  0  13  14  15

增加行列

可以通过列表等方式为新增行、列提供数据,但需要保证长度与dataframe一致。也可以通过series索引来精确赋值。

  • 增加行
df.loc['e']=[16,17,18,19]
df

# 返回

    A	B	C	D
a	0	1	2	3
b	4	5	6	7
c	8	9	10	11
d	12	13	14	15
e	16	17	18	19
  • 增加列
df.loc[:,'E']=[10,20,30,40,50]
df

# 返回

    A	B	C	D	E
a	0	1	2	3	10
b	4	5	6	7	20
c	8	9	10	11	30
d	12	13	14	15	40
e	16	17	18	19	50
  • 用series精确赋值
''' 通过series进行赋值,当series缺少E列时,默认为nan'''

a=pd.Series([10,20,30,40],index=['A','B','C','D'])
df5.loc['f']=a
df5

# 返回

    A		B		C		D		E
a	0.0	    1.0	    2.0		3.0		10.0
b	4.0		5.0		6.0		7.0		20.0
c	8.0		9.0		10.0	11.0	30.0
d	12.0	13.0	14.0	15.0	40.0
e	16.0	17.0	18.0	19.0	50.0
f	10.0	20.0	30.0	40.0	NaN

长宽表转换

  • 横竖表转换

    • 横表变竖表
      通过stack()或melt() 函数,可以将 df 结构的表转化为树形表。
      stack()是通过保证行索引不变,然后将所有列索引转化为行索引。
      melt()则是通过参数指明保持不变的列,再进行转化。
      melt()格式:melt(id_vars=[], var_name =[] , value_name)
      参数:
      id_vars:用于指明保持不变的列
      var_name:用于表示转化之后新增列的列名
      value_name:用于表示新索引对应值的名

stack() 示例:

import pandas as pd
tree = pd.DataFrame({
     "A":[1,4],"B":[2,5],"C":[3,6]})
tree

# 返回

	A	B	C
0	1	2	3
1	4	5	6

'''使用stack() 进行转化'''
tree.stack()

# 返回
0  A    1
   B    2
   C    3
1  A    4
   B    5
   C    6
dtype: int64

melt() 示例:

import pandas as pd
student = pd.DataFrame({
     "school":["五十七","十四中","二中"],"grade1":[623,466,285],'grade2':[668,485,226],'grade3':[621,429,281]})
student

# 返回
	school	grade1	grade2	grade3
0	五十七	623		668		621
1	十四中	466		485		429
2	二中	285		226		281


student.melt(id_vars="school",value_name="number",var_name="grade")

# 返回

	school	grade	number
0	五十七	grade1	623
1	十四中	grade1	466
2	二中	grade1	285
3	五十七	grade2	668
4	十四中	grade2	485
5	二中	grade2	226
6	五十七	grade3	621
7	十四中	grade3	429
8	二中	grade3	281
  • 竖表变横表
    通过unstack()或pivot_table() 函数,可以将树形表转化为 df 结构的表
'''unstack()的作用于stack()相反'''
tree.stack().unstack()

# 返回

	A	B	C
0	1	2	3
1	4	5	6


'''pivot_table()函数的作用类似于数据透视表的作用'''

student1.pivot_table(index="school",columns="grade",values= "number")

# 返回
grade	grade1	grade2	grade3
school			
二中	285		226		281
五十七	623		668		621
十四中	466		485		429

你可能感兴趣的:(Pandas)