Python:pandas库sort_values()方法的使用

31 篇文章 3 订阅

1、起因

今天做到北京玛达科技有限公司2021数据处理工程师笔试题,有一题是这样:

在这里插入图片描述
按照文件中单词出现频次由高往低依次排序,这个对我来说很好实现,用上 pandas 的 sort_values 方法就手到擒来。但是他后面又加上了一个条件,如果频次相同的情况下,按照单词的 MD5 值排序。这可把我迷住了:

  • 先用sort_values方法,频次由高往低依次排,再把频次相同单独拿出来再用 MD5 排?(因为sort_values排序后,同一频次的单词顺序会改变)
  • 还是先 MD5 排,再在不改变同一频次的单词顺序情况下,频次由高往低依次排?

最后去看了有关于 sort_values 的文档,成功解决先把单词出现频次由高往低依次排序,再把频次相同的情况下的单词按照 MD5 值排序这个问题,下面我带大家回顾一下 Python pandas sort_values() 方法的使用

2、sort_values() 函数说明

pandas 库的 sort_values() 函数可以对 Dataframe 的数据集按照某个字段中的数据进行排序。该函数可以指定列数据或行数据进行排序,可以是单个,也可以是 多个(以前经常用来处理单列/行数据,忘记了 sort_values() 也可以处理多列/行数据)。 series 也有 一个 sort_values() 函数,但在参数上稍有区别。

官方文档:pandas.Series.sort_valuespandas.DataFrame.sort_values

3、sort_values() 具体参数

格式如下:

DataFrame.sort_values(by=‘进行排序的列名或索引值’, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’, ignore_index=False, key=None)
参数说明
by指定要进行排序的列名或索引值
axis若 axis=0 或 ‘index’,则按照指定 的数据大小排序;若 axis=1 或 ‘columns’,则按照指定 索引 中数据大小排序。默认axis=0
ascending若 ascending=True,则按照升序排序;若 ascending=False,则按降序排序,默认为True,即升序排序。如果这是一个 bool 列表,则必须匹配 by 的长度
inplace排序后的数据是否替换原来的数据,默认为False,即不替换
ignore_index是否重置索引,默认为不重置

4、sort_values() 使用

4.1 单列/行排序

import pandas as pd
df = pd.read_csv('test.csv')
# 根据hello列降序排序
data = df.sort_values(by="hello", ascending=False, ,axis=0)
# axis=0表示按列,同理axis=1表示按行

4.2 多列/行排序

import pandas as pd
df = pd.read_csv('test.csv')
# 根据第一列降序排序,当第一列相同时,根据第三列进行升序排序。并且重置索引,替换原数据
data = df.sort_values(by = ['col1','col3'],ascending=[False,True],ignore_index=True,inplace=True)

5、应用

所以一开始那道题我这样写的:

# -*- coding: utf-8 -*-
# ---
# @Software: PyCharm
# @File: main.py
# @Author: WangYunchang
# @E-mail: wangyunchang@dxy.cn
# @Site: 
# @Time: 9月 20, 2022
# ---
import csv
import pandas as pd
import hashlib

counts = {}
# 读取文件
txt = open("word2count.txt").read()
# 将大写字母转化为小写
txt = txt.lower()
# 把文章中不是英文字母的全部代替为空格
for ch in '0123456789.,()%-':
    txt = txt.replace(ch, " ")
# 分割成列表
words = txt.split()
# 统计单词
for word in words:
    counts[word] = counts.get(word, 0) + 1
items = list(counts.items())
# 将所得单词及数目写入csv文件中
csvFile = open('word_result.csv', 'w', newline='')
# 写入表头,A是单词,B是出现次数
csv.writer(csvFile).writerow(["A", "MD5", "B"])
# 统计结果写入csv
writer = csv.writer(csvFile)
for key in counts:
    # MD5值
    ss = hashlib.md5(key.encode('utf-8')).hexdigest()
    writer.writerow([key, ss, counts[key]])
csvFile.close()
df = pd.read_csv('word_result.csv')
# 根据B降序排序,当B相同时,根据MD5进行降序排序
data = df.sort_values(by=["B", "MD5"], ascending=[False, False])
# 删除MD5
data = data.drop(columns="MD5")
# 把新的数据写入文件
data.to_csv('word_result.csv', mode='w', index=False)
  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跳舞的皮埃尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值