熟读 Python 基本数据结构,但实际应用时却大脑短路,无法解决问题?
熟悉 pandas ,但遇到没有内置的方法,就不知所措?
如果你有这种情况,那么你缺少的是解决问题的思路。
经常向我提问的同学应该知道,我一般不会直接给出代码,而是给你提供思路。本系列主打思路,基于同一思路,给出多种不同的解决方案,让你举一反三解决问题。
有位小伙伴提了一个简单的问题,数据如下:
我们需要知道一些前提知识。
pandas 中怎么指定列顺序?非常简单:
pandas 中怎么获取表的所有列名:
如何拼接 Python 中的2个列表:
理解这两点后,现在的问题其实不是什么 pandas 或 啥表头的顺序问题,而是一个列表构造问题:
接下来,基于这些前提条件和思路,看看能做出多少种解法
这是最直接的方式:
如果你不熟悉推导式,也可以用 for in 遍历
"我不懂啥推导式呀,遍历也用得不熟悉,有没有不用遍历的方式?"
"Python 不是一直声称语法简单吗,为什么不可以把 2 个列表相减,就得到剩余列名?"
这想法还挺有道理的,为什么不呢?
因为列表中的元素是可以重复的,如果 2 个列表能相减,他就要考虑有重复元素与没有重复元素的歧义。
因此,列表是不能相减,但是 Python 中的确有一种东西与列表相似,但他里面的元素不能重复—— set(集)
由此我们可以得到第二种解法:
细心的你可能注意到,出来的结果中,其他列的顺序与解法1不一样!
因为 set 是不关心元素顺序的,2 个 set 相减后,顺序变化了
"有没有不同遍历,有可以保留其他列的原始前后顺序的?"
前面的解法,本质上都在做去重工作。pandas 中不也有去重功能吗,我们也可以用上。
"有问题啊,new_cols 是列表?,不应该是一个 Series 吗?为什么 df[一个Series] 也能改变列顺序?"
实际上,df[] 里面可以接受大多数序列,比如 set 或 numpy 的数组等等,唯独元组不行。
这涉及到多层索引的东西,超纲了,可参考:
上面 3 种解法都很好解决了问题,并且解法1和3还能保证其他列的顺序不变。
但是,如果目标列 key1,2,3 可能会出现缺失,比如某个表只有 key1 和 key2,那么今天的 3 种方法都不能执行。
不妨用今天教你的思路,想想怎么解决这个难题
公众号回复"数据处理"获取源码