在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() 方式实现。
# 将行索引改变为一二三
df.index = list("一二三")
df
# 返回
小写 大写
一 a A
二 b B
三 c C
# 将列索引改为l,u
df.columns = list('lu')
df
# 返回
l u
一 a A
二 b B
三 c C
示例:将 df 的行索引变为123,列索引变为“小写”,“大写”,并将修改结果返回给 df
df.rename(index = {
"一":1,"二":2,"三":3},columns = {
"l":"小写","u":"大写"},inplace = True)
df
# 返回
小写 大写
1 a A
2 b B
3 c C
'''创建一个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
# 创建一个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
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缺少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() 示例:
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()的作用于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