拯救pandas计划(16)——将DataFrame的奇偶列位置进行前后对调

  • / 数据需求
  • / 需求拆解
  • / 需求处理
  • / 总结

最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas,闭口pandas了,故而写下此系列以让更多的小伙伴们爱上pandas。

系列文章说明:

系列名(系列文章序号)——此次系列文章具体解决的需求

平台:

  • windows 10
  • python 3.8
  • pandas >=1.2.4

/ 数据需求

首先非常感谢【瑜亮老师】在交流群里给出的问题,有了写下这一篇的灵感。

【瑜亮老师】在群里给出的问题是:把df的奇数列与偶数列调换位置。比如A列,B列,调换成B列,A列…… 其中的数据列是偶数个,在操作方面会稍微简单点,这里做一个拓展,使用奇数个的列进行操作。原始数据如下:

ps: 提到奇偶列为自然数从1开始计数,如A列位置为奇数列

import pandas as pden = 'abcdefg'
df = pd.DataFrame(([i + j for j in en] for i in en), columns=list(en.upper()), index=list(en.upper()))

目标样式:

可以进行奇偶匹配的相邻两列发生了位置变换,而最后一列G无法与其后的数据匹配则无需交换,仍然处于最后位置。

/ 需求拆解

在文章开始就有说到,列数量为偶数比奇数容易处理,所以可以先将数据看做列数量为偶数个进行处理。将数据降低为偶数个列的数据框。

/ 需求处理

  • 偶数个列的数据框
import pandas as pden = 'abcdef'
df = pd.DataFrame(([i + j for j in en] for i in en), columns=list(en.upper()), index=list(en.upper()))

比问题中提到的数据框少了一列G,因为是奇偶列且相邻的两列进行对调,可以使用numpy将提取出来的奇数列和偶数列组成2*n的二维数组,再以列方向摊平成一维数组,方法如下。

import numpy as npodd_c = df.columns[::2]  # 获取奇数列
even_c = df.columns[1::2]  # 获取偶数列# 生成2*n的数组再从列方向摊平成一维数组,注意:偶数列在上方
new_c = np.array((even_c, odd_c)).flatten('F')
print(df[new_c])

df.columns自身的values对象就是np.array类型的,可以直接通过自身的转换一步步达到目的。

先将df.columns进行重新排序,原来是一维数组改成二维数组,改变过程中,以列方向进行排序,即:

new_c = df.columns.values.reshape((2, len(df.columns) // 2), order='F')

与上一方法不同的是,奇数位置列处于上方,此时将上下位置调换就可以再使用flatten方法将数组摊平,并达到奇偶列位置调换的目的。

df[new_c[::-1].flatten('F')]

上述两种都是将列名提取重新构造形状再转为一维数组形式,完成奇偶列的位置调换。

还可以运用-1的n次方的性质,如果为奇数,则使用它前一个列,如果为偶数就是用当前列的后一列,例如,[0,1] --> [1,0],在这里就很简单的完成了交换。

new_c = [df.columns[i + (-1) ** i] for i in range(len(df.columns))]
# ['B', 'A', 'D', 'C', 'F', 'E']
df[new_c]

此处的i为各个列名所在的索引位置,A列的索引为0,通过 0 + (-1) ** 0的算数运算得到1,即为B列的索引。而遍历到i=1时,通过计算为1 + (-1) ** 1 = 0,B列处就返回了A列的索引。

  • 奇数个列的数据框

以上使用了简单的方法将偶数个列的数据框中的奇偶列位置完成的对调。

显然,要将奇数个列名重新构造成一个2*n的数组是不行的,且得知最后一列无需跟任何一列进行位置交换,可以将最后一个列名单独拿出,让剩下的组成2*n的数组。

import numpy as np  c = df.columns.values
# 分离最后一个列名
c_ = c[:-1]
c_last = c[-1]
# 方法同偶数个列数据框
c_new_even = c_.reshape((2, len(c_) // 2), order='F')[::-1].flatten('F')
# 将最后一个列名拼接到最后
new_c = np.hstack([c_new_even, c_last])

然而通用性就差了一点,不能将偶数个列的数据框进行转换,可以试下下面这个方式:

import numpy as npc = df.columns.values
# 获取另一个维度值
c_middle = len(c) // 2
# 获取列中的最后一个列名,如果为偶数列则返回空列表
c_last = [c[-1]] * (0 + len(c) % 2)
# 重构形状,拼接最后一个列名
new_c = np.hstack((c[:c_middle * 2].reshape((2, c_middle), order='F')[::-1].flatten('F'), c_last))

这个就可以即对偶数个列进行操作又能对奇数个列进行操作,两个不同点在于,下面这种动态获取最后一个元素,如果列数量是偶数个,则返回空列表。

在使用(-1)的n次方时处理奇数个列也是会遇到无法将奇偶数位置进行交换。

[i + (-1) ** i for i in range(len(df.columns))]

数据列名为A-G,对应的索引为0-6(包括6),使用该方法生成的7是不能从列名中提取的。此时可以使用数据修剪函数,将大于最大索引的数据修正为最大索引。

import numpy as npnp.clip([i + (-1) ** i for i in range(len(df.columns))], 0, len(df.columns) - 1)

生成的索引为该数据中最大的索引值,且此之前的列均发生了奇偶列位置对换。

/ 总结

本例中使用简单的解决方法,通过使用列名的索引查找,numpy数组的形状的灵活变换,数组的数据修剪,数字-1的次方性质等方法,非常简便的将数据框的奇偶列位置进行顺序改变,对此例产生发散思维,多角度解决数据需求,仍有考虑不足之处,烦请各位看官谅解。

绿叶新枝芽初开,望等闲。


于二零二二年五月二十日作

拯救pandas计划(16)——将DataFrame的奇偶列位置进行前后对调相关推荐

  1. 拯救pandas计划(7)——对含金额标志的字符串列转换为浮点类型数据

    拯救pandas计划(7)--对含金额标志的字符串列转换为浮点类型数据 / 数据需求 / 需求拆解 / 需求处理 方法一 方法二 / 总结 最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投 ...

  2. 拯救pandas计划(22)——再话extract和extractall

    拯救pandas计划(22)--再话extract和extractall 最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas, ...

  3. pandas比较两个dataframe特定数据列的数值是否相同并给出差值:使用np.where函数

    pandas比较两个dataframe特定数据列的数值是否相同并给出差值:使用np.where函数 目录 pandas比较两个da

  4. pandas中如何提取DataFrame的某些列

    在处理表格型数据时,一行数据是一个 sample,列就是待提取的特征.怎么选取其中的一些列呢?本文分享一些方法. 使用如下的数据作为例子: import pandas as pd data = pd. ...

  5. Pandas 根据一张DataFrame的两列数据对另一张DataFrame的多列值进行批量替换

    背景 掌柜最近在做王者荣耀2022KPL春季赛的赛事数据分析,下表kpl是从官方数据平台获取到的2022KPL春季赛常规赛近500场的赛事数据: 这里大家可以很明显的看到team_bh和team_ph ...

  6. pandas数据结构:Series/DataFrame;python函数:range/arange

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  7. python dataframe取一列_python - 从pandas DataFrame列标题中获取列表

    python - 从pandas DataFrame列标题中获取列表 我想从pandas DataFrame中获取列标题列表. DataFrame将来自用户输入,因此我不知道将会有多少列或将调用它们. ...

  8. pandas之Seris和DataFrame

    pandas是一个强大的python工具包,提供了大量处理数据的函数和方法,用于处理数据和分析数据. 使用pandas之前需要先安装pandas包,并通过import pandas as pd导入. ...

  9. Python 数据分析三剑客之 Pandas(一):认识 Pandas 及其 Series、DataFrame 对象

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

最新文章

  1. 二值logit模型的适用条件_一文读懂条件Logistic回归
  2. LabVIEW实现CRC校验
  3. nginx进阶-动静分离,负载均衡
  4. EM算法和GMM(中)
  5. 李洪强-C语言2-字符串
  6. 前端学习(3124):react-hello-react之props的简写
  7. 正在读取软件包列表... 有错误!
  8. java servlet 获取mac地址_Java开发网 - 请教大家几个关于servlet取ip和mac地址的问题~~!...
  9. [转] Silverlight Navigation(多页面切换、传值)
  10. 【英语学习】【English L06】U02 Food L1 Food on the menu
  11. 第一 二章 计算机基础知识,[精品]第二章-计算机基础知识.doc
  12. SpringBoot之idea调出Maven Project
  13. 从 1 加到 55 的值
  14. MATLAB 非对称矩阵求逆
  15. uniapp跳转指定小程序
  16. 无约束一维极值——黄金分割法
  17. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等...
  18. Unity3D官方案例--太空射击游戏总结
  19. c语言异形图片,“异形”二字描述了他的一生
  20. android 8.1 wifi感叹号,Android 网络图标上的感叹号(更新Android 7.1.1/Android 8)

热门文章

  1. 【小波变换基础知识+实战应用】Matlab中小波、小波包函数的分解,重构及区别等(持续更新)
  2. 大数据用Python还是JAVA
  3. 大数据时代农商银行转型发展的思考
  4. 「PHP」原生PHP
  5. 云朵子 -- 云朵君微信表情包第一弹新鲜出炉
  6. HarmonyOS连接新体验,半入耳舒适降噪耳机华为FreeBuds 4E全新亮相
  7. Discuz和WordPress数据库加密方式
  8. Linux命令详解:md5sum 命令
  9. unity5 新布料系统 分析
  10. ajax同步请求 超时时间问题