pandas中索引重置set_index和reset_index的用法

1.set_index

DataFrame可以通过set_index方法,可以设置单索引和复合索引。 
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False) 

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['a','b'])  #新建一个数据框,索引为空。
print(df)

输出结果:

Empty DataFrame
Columns: [a, b]
Index: []

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['a','b'],index=[0,8,9,0])  #新建一个数据框,并设置索引
print(df)

输出结果:

     a    b
0  NaN  NaN
8  NaN  NaN
9  NaN  NaN
0  NaN  NaN

#因为'a','b'列还没有赋值,故默认为空值。

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['a','b'],index=[0,1,2,3])  #新建一个数据框,并设置索引
a = pd.Series(['bar','bar','foo','zoo'])
b = pd.Series(['one','two','one','shree'],index=[0,1,2,3])
c = pd.Series(['z','x','y','d'])
d = pd.Series([1,5,7,9])
df['a'] = a
df['b'] = b
df['c'] =c
df['d'] =d
print(df)

输出:

     a      b  c  d
0  bar    one  z  1
1  bar    two  x  5
2  foo    one  y  7
3  zoo  shree  d  9

#4个series给数据框赋值,在初始化dataframe的时候并没有设定c.d列,赋值的时候默认用c、d两个
#series的变量名字作为了列索引(字段名)

indexed1 = df.set_index('c',append=True)  #新增c列设置为索引,参数append=True
indexed1

输出:

 

 

indexed1 = df.set_index('c',append=False)  #将c列设置为索引,参数append=False
indexed1


输出:

pandas中索引重置set_index和reset_index的用法_第1张图片

indexed1 = df.set_index('c',drop=False) #设置参数drop=False(默认是True),更新索引的同时保持c列存在。
indexed1

输出:

pandas中索引重置set_index和reset_index的用法_第2张图片

indexed1 = df.set_index(['c','d'],drop=False) #设置参数drop=False(默认是True),更新索引的同时保持c,d列存在。
indexed1

输出:

pandas中索引重置set_index和reset_index的用法_第3张图片

 2.reset_index 
reset_index可以还原索引,重新变为默认的整型索引 
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”) 
level控制了具体要还原的哪个等级的索引 
drop为False则索引列会被还原为普通列,否则会丢失该列数据,慎重使用。

indexed1 = df.set_index(['c','d'],drop=False) #设置参数drop=False(默认是True),更新索引的同时保持c,d列存在。
indexed1

输出:

pandas中索引重置set_index和reset_index的用法_第4张图片

indexed1.reset_index()

错误提示:ValueError: cannot insert d, already exists

因为上一步保留了c,d列,因此还原的时候出现冲突,提示已经存在,做如下修改。

indexed1 = df.set_index(['c','d']) #设置参数drop=False(默认是True),更新索引的同时保持c,d列存在。
indexed1

输出:

pandas中索引重置set_index和reset_index的用法_第5张图片

pandas中索引重置set_index和reset_index的用法_第6张图片

当我们在清洗数据时往往会将带有空值的行删除,不论是DataFrame还是Series的index都将不再是连续的索引了,那么这个时候我们可以使用reset_index()方法来重置它们的索引,以便后续的操作。
具体例子:

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(20).reshape(5,4),index=[1,3,4,6,8])
print(df)

输出:

print(data.reset_index())

输出:

可以看到此时获得了新的index列,而原来的index变成了我们的数据列,保留了下来。
如果我们不想保留原来的index为普通列,直接使用重置后的索引,那么可以使用参数drop=True,默认值是False

print(data.reset_index(drop=True))

这里写这个的目的是为了后面对数据处理的应用:举个例子,
新建一个空的DataFrame,只有列索引,没有对应的数据,当你需要引用对应的Series数据到DataFrame中时,
如果每个Series的index都不一样,那么添加时就会出现NaN值,甚至是错误提示:
ValueError: cannot reindex from a duplicate axis。

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['a','b'])
print(df)
print("--------------------")
b = pd.Series([1,1,1,1,1],index=[0,1,3,4,5])
a = pd.Series([2,2,2,2,2,2],index=[1,2,3,4,6,7])
df['a'] = a
df['b'] = b
print(df)

输出:

pandas中索引重置set_index和reset_index的用法_第7张图片

明显看到b的2索引为空值,这是因为b没有2这个索引,
如果我们需要它们从0开始按一个顺序排列,那么我们需要使用reset_index()的处理。

 

 

 

 

你可能感兴趣的:(python基础)