拯救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. tomcat安装及虚拟web主机
  2. android systemtrace 报错
  3. Ubuntu下用apache+perl搭建最简单的聊天室
  4. 请简述计算机硬件系统的运行过程,操作系统简述题
  5. vscode 怎么编辑sphinx_如何在vs Code 中编辑和调试Stata程序
  6. 足不出户带你体验专业实验室,技术实现不在话下
  7. oracle 还原归档,ORACLE RMAN 还原归档日志
  8. python使用新的有序序列重新替换原有的值
  9. gcd常见结论及gcd与斐波那契结合--hdu6363.
  10. Eclipse查看hadoop源代码出现Source not found,是因为没有添加.zip
  11. ▲数据结构 【2012】五2 C++版
  12. Python条件分支语法
  13. [源码和报告分享]基于Android-JavaEE-DB2实现的旧物交易平台
  14. 形式语言与自动机 图灵机
  15. MACD-DKJ金叉选股、金蜘蛛选股、均线粘合公式
  16. ESP32开发环境的搭建和 ESP-IDF支持以下调试方法
  17. 服务网关-Zuul(二)
  18. java基础系列(四)UTF-8和GBK编码的区别
  19. Domain Adaptation(领域自适应,MMD,DANN)
  20. listview 和RecycleView区别

热门文章

  1. java调用Filemaker data api
  2. 计算机的利与弊的英语作文,关于电脑利与弊的英语作文
  3. js日期加减一天_Js 日期加减天数
  4. 弘辽科技:超级店长的标题优化靠谱吗?
  5. 【nohup】nohup命令的简单使用
  6. linux 网卡加网桥,CentOS 7网卡网桥设置
  7. C语言中,如何求方差
  8. Google adsense帐号最新申请方法与心得
  9. 【数据结构】适用于面试的55项题
  10. 玩转各大自媒体平台的推荐机制,让你快速上爆文,让你快速月入过万!