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
输出:
indexed1 = df.set_index('c',drop=False) #设置参数drop=False(默认是True),更新索引的同时保持c列存在。
indexed1
输出:
indexed1 = df.set_index(['c','d'],drop=False) #设置参数drop=False(默认是True),更新索引的同时保持c,d列存在。
indexed1
输出:
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
输出:
indexed1.reset_index()
错误提示:ValueError: cannot insert d, already exists
因为上一步保留了c,d列,因此还原的时候出现冲突,提示已经存在,做如下修改。
indexed1 = df.set_index(['c','d']) #设置参数drop=False(默认是True),更新索引的同时保持c,d列存在。
indexed1
输出:
当我们在清洗数据时往往会将带有空值的行删除,不论是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)
输出:
明显看到b的2索引为空值,这是因为b没有2这个索引,
如果我们需要它们从0开始按一个顺序排列,那么我们需要使用reset_index()的处理。