Pandas的基础操作:排序/设置行索引

刚刚使用Python进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~

本文将介绍Pandas操作的最后一个部分,前两篇分别是:
《Pandas的基础操作:介绍/创建/查看数据/赋值》:https://blog.csdn.net/weixin_42969619/article/details/96863875
《Pandas的基础操作:合并数据.merge()函数的使用》:https://blog.csdn.net/weixin_42969619/article/details/97132359


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)})                  

在这里插入图片描述

  • axis=1时,按照列索引的大小排序,且ascending=True/inpalce=False
data.sort_index(axis=1) 

在这里插入图片描述

其中axis=0默认的情况即为原始数据;没有指定index所以系统自动生成从小到大的行索引
排序之后,重新打印data显示原始数据,因为参数inplace=False
  • 按照"D"和"C"列进行排序,且ascending=True/inpalce=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
  • 按照列索引的大小排序即axis=1,但ascending=False且inpalce=True
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

在这里插入图片描述

  • 按列"A"和"C"列进行排序,并设置na_position=“last”
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数据作为例子:

  • 将"A"和"D"列作为行索引
# 对比设置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'))

在这里插入图片描述

  • 没有传入任何参数,即drop=False时,默认是将全部级别的行索引都转为列数据,并使用一个RangeInddex来作为新索引。
data1.reset_index()

在这里插入图片描述

效果等同于 data1.reset_index(level=[‘State’,’Direction’])
  • 使用level参数可以选择指定的行索引
data1.reset_index(level=1) 
# or 
data1.reset_index(level=‘Direction’)

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值