python dataframe排序_实现相同功能,Excel和Python到底哪个好

旗鼓相当的对手,吗?

32bcfb6a4e5c550b79741d7019b3e3dc.png

新建Excel文件

之所以讲这个功能,是因为有时候我们学习新知识时,想自己动手实验一下,但却苦于手头没有现成的数据

如果靠纯手动新建一个Excel,再填充内容,会显得比较麻烦,所以可使用如下方式新建一份数据。

import pandas as pdimport numpy as npdf = pd.DataFrame({'姓名': ['鸣人', '佐助', '小樱', '鹿丸', '丁次', '井野'],                   '语文': np.random.randint(60, 100, 6),                   '数学': np.random.randint(50, 100, 6),                   '英语': np.random.randint(50, 100, 6),                   '物理': np.random.randint(60, 100, 6),                   '化学': np.random.randint(60, 100, 6)})df = df.set_index('姓名')df.to_excel('./新建文件.xlsx')

运行上面代码后,结果如下:

11be1820509df0e2407b4aad25f3e6b6.png

新建文件.xlsx

用pandas生成的Excel文件,表头和索引会自动加粗

普通排序

将下面数据,按成绩从高往低排序:

7b459da35ee13162061a2e2631a2cb77.png

学生成绩.xlsx

Excel操作:

a5723f01c3dce41488faa7f7d394a9bc.gif

Python操作:

import pandas as pddf = pd.read_excel('./学生成绩.xlsx', index_col='姓名')df.sort_values(by='成绩', ascending=False, inplace=True)print(df)

参数解释:

  • by:根据哪一列进行排序
  • ascending:True表示升序,False表示降序,默认为True
  • inplace:True表示在原DataFrame上修改,False表示返回一个新的DataFrame,默认为False

运行上述代码后,结果如下:

09e6851bb2c78ac6ac66c0055689f597.png

忽略表头的不对齐,Pycharm默认显示就这样。

多重排序

现在数据如下,并要把男女生成绩分开排序,即先按男女生排序,再按成绩排序。

8990f79414b00ac4167bc85ebebdd136.png

学生成绩2.xlsx

Excel操作:

d45c3313dbcbb41e0c9fd6717ac27e40.gif

Python操作:

import pandas as pddf = pd.read_excel('./学生成绩2.xlsx', index_col='姓名')df.sort_values(by=['性别', '成绩'], ascending=[False, False], inplace=True)print(df)

与普通排序的区别在于,将“性别”和“成绩”作为两个元素,组成一个列表传给参数by,其对应的排序方式,也组成一个列表传给参数ascending,如果排序方式一样,可以只传False,但为了看上去好理解,我这里就写两个False组成一个列表。

运行上面代码后,结果如下:

82b4c9d73ff06a31037ff3051bd9981b.png

另外需要注意的是,在Excel中对字符进行排序时,是按照拼音来的,所以想要男在女前,应选择升序。而在Python3却使用了降序,是因为根据字符的Unicode值进行排序的,可用内置函数ord()查看:

print(ord('男'))  # 30007print(ord('女'))  # 22899

数据筛选

从下面的数据中,筛选出语文成绩在60到70之间(不包括70),但数学成绩在60以下(不包括60)的学生。

92990a1d72329a033b154cac18f38dad.png

学生成绩3.xlsx

Excel操作:

c5cb23f50c225f1f27ac984f0b8261c2.gif

Python操作:

import pandas as pddef condition1(x):    return 60<=x<70def condition2(x):    return x<60df = pd.read_excel('./学生成绩3.xlsx', index_col='姓名')df = df.loc[df.语文.apply(condition1)].loc[df.数学.apply(condition2)]print(df)

先定义两个函数,用来实现相应的筛选功能。然后再用df.语文(也可写df['语文'])取出语文这一列数据(Series类型),再调用apply方法,将事先定义好的函数作为参数传入,完成语文成绩的筛选,然后同样的方法,再对数学成绩进行筛选。

运行上面代码后,结果如下:

a877db57cd04b112a6f6b0b8be514a4b.png

最后我猜,肯定会有人认为,使用Python不见得比使用Excel方便。主要原因是,从视觉效果上来看,有时间敲这些代码,还不如直接使用Excel操作,但其实并不是这样,虽然代码看上去似乎有点多,但如果熟练的话,几乎就是打每个单词的前几个字母,然后按Tab键自动补全即可, 实际敲的代码并不多。

还有一点就是,使用Python有点一劳永逸的味道,因为一旦写好了针对某个功能的代码,如果后面需要再次使用,只需要改一两个关键值即可,比如将最后一个例子中的数学成绩改成小于70,就只需将60改成70即可,如果使用Excel操作的话,还需要再点点点好几下,冗余操作比较多。当然,如果想要实现更复杂操作的话,Python的优势会更加明显,这个以后再另起一篇文章说。


关注微信公众号“Python小镇”,发现更多干货知识!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值