在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
- 按条件选取行
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