刚刚使用Python进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~
本文将介绍Pandas操作的最后一个部分,前两篇分别是:
《Pandas的基础操作:介绍/创建/查看数据/赋值》:
《Pandas的基础操作:合并数据.merge()函数的使用》:
8. 排序:
(1)索引排序:data.sort_index()
应用场景:在使用sklean的时候,会将原数据随机抽取一部分作为“训练集”,这是随机抽取的结果就会打乱原数据的索引,当不需要改变索引,但是需要从新排序时
参数说明:
a. 参数axis:默认值为0表示按行索引排序;axis=1时表示按列索引排序
b. 参数by:指定列名,默认值为空
c. 参数ascending:默认值为True表示正序;ascending=False时表示倒序
d. 参数inpalce:是否用排序后的数据集替换原来的数据,默认为False,即不替换
以下列数据为例:
data = pd.DataFrame({'A': ['food','fruit','food','fruit',
'food','water','food','fruit'],
'D': ['one','one','two','three',
'two','two','one','three'],
'C': np.random.randint(5,size=8),
'B': np.random.randn(8)})
data.sort_index(axis=1)
其中axis=0默认的情况即为原始数据;没有指定index所以系统自动生成从小到大的行索引
排序之后,重新打印data显示原始数据,因为参数inplace=False
data.sort_index(by="D")
data.sort_index(by=["D","C"])
需要注意的是:
a. 只对"D"排序的时候,按照字母顺序:one>three>two
b. 对"D"和"C"一起排序的时候,是先排"D"列,如果"D"列中有重复值时,才会根据"C"列内容排序
c. 排序之后,重新打印data显示原始数据,因为参数inplace=False
data.sort_index(axis=1,ascending=False,inplace=True)
data
此时由于参数inpalce=True,所以修改的原数据,从新打印data时,是被操作过的数据
(2)按照某列的值进行排序:data.sort_values(by="X")
参数说明:
a. 参数by:指定列名,必填参数
b. 参数axis:默认值为0表示按行索引排序;axis=1时表示按列索引排序
c. 参数ascending:默认值为True表示正序;ascending=False时表示倒序
d. 参数inpalce:是否用排序后的数据集替换原来的数据,默认为False,即不替换
e. 参数na_position:设定缺失值的显示位置,可以选择‘first’或‘last’
以上面数据data为例,但是重新对其附一些空值
# 对5行0列的数字附空值;对“B”列中1,2行两个值附空值
data.iat[5,0]=np.nan
data.loc[df.index[1:3],"B"]=np.nan
data
data.sort_values(by=["A","C"],na_position="last")
9. 设定索引:
(1)将数据中的列作为行索引:
data.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数说明:
a. 设置索引的参数是keys
b. append添加新索引
c. drop为False时,成功设置了index,同时列数据中仍然保存着index字段
d. inplace为True时,修改了原始数据
使用原始的data数据作为例子:
# 对比设置index顺序不同的结果
df.set_index(keys=['A', 'D'])
df.set_index(keys=['D','A'])
可以看出来,虽然后者的操作后,看上去好像将"D"中重复的数据而"A"中不重复的数据进行堆叠,形成看似有“层级”关系的状态;
但实际上仍然是在临近数据有相同值时省略表示而已。
如果需要“层级”的表现,需要对数据进行更复杂操作
(2)还原索引:
应用场景:在使用contact等合并数据之后,index可能发生重复;或者在进行排序,删除等操作时,index会发生顺序混乱。这些不是我们希望的那样,所以,除了对行索引排序以外,还可能需要对行索引进行重新设置
data.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)
由于上面数据没有办法很好显示出来“层级”的关系,所以重新创建数据,并以其作为例子:
index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], ['North', 'South']],
names=['State', 'Direction'])
data1 = pd.DataFrame(index=index, data=np.random.randint(0, 10, (6,4)), columns=list('abcd'))
data1.reset_index()
效果等同于 data1.reset_index(level=[‘State’,’Direction’])
data1.reset_index(level=1)
# or
data1.reset_index(level=‘Direction’)