python set没有顺序_Python一题多解学思路:指定列前置

本文探讨如何在不明确所有列名的情况下,利用Python和pandas将特定列调整到数据表最左边。通过解析问题,提出三种解决方案:遍历排除法、集合相减法和使用pd.Series去重法,每种方法都注重思路的阐述和代码实现。
摘要由CSDN通过智能技术生成

前言

熟读 Python 基本数据结构,但实际应用时却大脑短路,无法解决问题?

熟悉 pandas ,但遇到没有内置的方法,就不知所措?

如果你有这种情况,那么你缺少的是解决问题的思路。

经常向我提问的同学应该知道,我一般不会直接给出代码,而是给你提供思路。本系列主打思路,基于同一思路,给出多种不同的解决方案,让你举一反三解决问题。


问题

有位小伙伴提了一个简单的问题,数据如下:

4a725896a64590b628eda5f2af079cbf.png
  • 我希望把列"key1,2,3"调整到表头的最左边,其他的列顺序我不关心
  • 别让我把所有列名写出来,因为我有些表可能有几十上百的列

前提

我们需要知道一些前提知识。

pandas 中怎么指定列顺序?非常简单:

2050f8d3f03383bd8057e9993c48a0dc.png
  • 往 df[] 中指定多个列名的 list 即可
  • 显然,提问者就是不希望手工输入所有的列表

pandas 中怎么获取表的所有列名:

2da92607cea1facffa6faa26094c8564.png
  • df.columns 即可。
  • 如果希望得到列表,只需要 list(df.columns) 即可

如何拼接 Python 中的2个列表:

fb09faec0f3c59a6a8b00b53d4ef6d80.png

理解这两点后,现在的问题其实不是什么 pandas 或 啥表头的顺序问题,而是一个列表构造问题:

1917951c252c535ddc9764c8d0c006b1.png
  • 行4:是解决问题的关键

接下来,基于这些前提条件和思路,看看能做出多少种解法


解法1

这是最直接的方式:

f108c7615c63649dfef71ba31338f979.png
  • 行4-7:遍历所有列,把非目标列名去掉即可

如果你不熟悉推导式,也可以用 for in 遍历

"我不懂啥推导式呀,遍历也用得不熟悉,有没有不用遍历的方式?"


解法2

"Python 不是一直声称语法简单吗,为什么不可以把 2 个列表相减,就得到剩余列名?"

这想法还挺有道理的,为什么不呢?

因为列表中的元素是可以重复的,如果 2 个列表能相减,他就要考虑有重复元素与没有重复元素的歧义

因此,列表是不能相减,但是 Python 中的确有一种东西与列表相似,但他里面的元素不能重复—— set(集)

由此我们可以得到第二种解法:

714f6b0ca120b1f3817e34e37adb3dda.png
  • 行4:用 set 函数得到 set 结构,即可相减。
  • 为什么需要在外面再套一个 list 呢?因为下一步我们需要使用 "列表相加" 的骚操作

细心的你可能注意到,出来的结果中,其他列的顺序与解法1不一样!

因为 set 是不关心元素顺序的,2 个 set 相减后,顺序变化了

"有没有不同遍历,有可以保留其他列的原始前后顺序的?"


解法3

前面的解法,本质上都在做去重工作。pandas 中不也有去重功能吗,我们也可以用上。

1a738b81dcc0a530c83a7bd7b49b56ad.png
  • 行4:pd.Series 中传入有重复元素的列表,就能返回一个 Series。使用他的去重方法即可完成

"有问题啊,new_cols 是列表?,不应该是一个 Series 吗?为什么 df[一个Series] 也能改变列顺序?"

实际上,df[] 里面可以接受大多数序列,比如 set 或 numpy 的数组等等,唯独元组不行

这涉及到多层索引的东西,超纲了,可参考 pandas 专栏第3节内容:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值