Skip to content

python pandas数据排序

0 背景

Pandas是一个广泛使用的Python库,专门用于数据处理和分析。之前我们介绍了相关的筛选、查询、操作。本篇我们主要介绍pandas的数据排序。排序对于数据的可读性、分析以及最终的数据可视化都是关键步骤。

Pandas中的排序方法:

  • sort_values()方法:这是Pandas中用于根据一个或多个列的值对数据进行排序的主要方法。
  • sort_index()方法:该方法根据索引排序DataFrame。

1 使用

初始化数据

image-20231226232524490

在WPS中初始化数据:

df = xl("$A$1:$G$18", headers=True, sheet_name="工作表1")
# 设置索引为uid列
df.set_index('uid',inplace=True)
print(df.head())

在python中初始化数据:

# 初始化数据
# df = pd.read_csv('./工作表1.csv')
data = {  
    "uid": [0, 3,2, 4, 5, 6, 7, 8, 9],  
    "uname": ["雷嘉伦", "杜睿", "孙晓明", "方宇宁", "彭睿", "苏詩涵", "宋子异", "彭震南", "钟宇宁"],  
    "usex": ["男", "男", "男", "男", "男", "女", "男", "男", "男"],  
    "uage": [79, 83, 19, 31, 18, 71, 47, 55, 59],  
    "umail": ["lj712@mail.com", "ruidu@hotmail.com", "xiaomsun@gmail.com", "", "pengrui910@icloud.com", None, "ziyso@gmail.com", "zhepeng404@gmail.com", "yuningzhong407@hotmail.com"],  
    "ucity": ["洛杉矶", "广州市", "纽约", "深圳", "纽约", "东莞", "中山", "阿克伦", "芝加哥"],  
    "udate": ["2001/11/13", "2002/5/7", "2010/8/9", "2018/12/17", "2017/4/3", "2021/1/20", "2001/6/18", "2016/2/17", "2014/3/15"]  
}
df = pd.DataFrame(data)
df.set_index('uid', inplace=True)

sort_index()

按照索引降序

# 按照索引降序
df.sort_index(ascending=False)

按照列排序

# 按照列排序
df.sort_index(axis=1)

在原数据基础上排序, 不返回新的Dataframe

# 在原数据基础上排序, 不返回新的数据
df.sort_index(inplace=True)

索引重新0-(n-1)排,不使用原来的索引

# 索引重新0-(n-1)排,不使用原来的索引, 可以得到它的排序号 
df.sort_index(ignore_index=True)

空值在排序中的位置

# na_position='first', 表示空值排在前面,另'last'表示空值在后(此处是指索引的空值), 默认是'last'
df['umail'].sort_index(na_position='first')

自定义函数排序

# 按照自定义函数排序
df.sort_index(key=lambda x:abs(x-5))
df1 = pd.DataFrame({"a": [1, 2, 3, 4]}, index=['A', 'b', 'C', 'd'])
df1.sort_index(key=lambda x: x.str.lower())

sort_values()

数据值的排序主要使用sort_values(),数字按大小顺序,字符按字母顺序。Series和DataFrame都支持此方法。

按照单、多列排序

df.sort_values(by='usex')
df.sort_values(by=['usex', 'umail'], na_position='last', ascending=False)
# 按照usex降序, umail升序的形式排序
df.sort_values(by=['usex', 'umail'], ascending=[False, True])

修改立即在原Dataframe上生效

df.sort_values('usex',inplace=True)

索引重新0-(n-1)排

# 索引重新0-(n-1)排
df.sort_values('umail', ignore_index=True)

按照大小值排序

# 按值大小排序
df['uage'].nlargest(3)
df.nlargest(3, 'uage')

# 等同于
df.sort_values('uage', ascending=False).head(3)
df.nsmallest(3, ['uage', 'uid'])

2 关于

欢迎关注我的微信公众号