也是最近的一个需求, 将一个 Excel 表, 多列转多行, 就把那种行的, 业务人员经常搞的那种垃圾表,给它转为咱熟悉的数据库表的形式, 多列转多行. 还要帮他们处理数据, 恶心得一批, 其实也不一定非要用什么 Pandas , 就循环遍历二维数据而已, 可能是, Pandas 比较很好, 就总是会将它作为我的第一选择, 事实证明, 它确实无敌强, 理论上能处理任何数据的骚操作.

需求

注: 写错字了, 木有 "两", 就是 前 4 列, 尴尬得一批.

方案

  • 读取数据为一个数据, 用 Pandas 来读, iloc 来索引值, 根据下标
  • 两个 for 循环, 分别代表两个方向 (垂直 和 水平) 谁先谁后, 无所谓的, 结果不变, 只是顺序变了.
  • 假设我们, 外层循环为水平方向, 内层则为 垂直方向. (外层每移动 1 列, 内层则移动 n 行)
  • 最后把所有的结果, 拼接起来, 存为 Excel 即可

实现

这里我用我小伙伴的代码吧, 自己就不写了, 写啥代码, 要什么自行车.. 会搬砖, 收藏, 还有模仿, 这才是代码成功之道

核心代码

df = pd.read_excel(file_path)

columns = df.columns.values

# 需要转置的那部分 DF
row_n = df.shape[0] -1
col_n = df.shape[1] - 4 ret = [] # 大列表来存储所有的 # 外层水平向右1列, 内层垂直向下遍历移多行
for i in range(col_n):
for j in range(row_n):
# 索引取值 iloc[行索引,列索引] 即可
lst = [ # 先取前四列, j+1 是为了跳过第 2 行
df.iloc[j+1, 0], df.iloc[j+1, 1],
df.iloc[j+1, 2], df.iloc[j+1, 3], # 再取当前列的, 前两行, 和 对应的值 (i,j) 再来3个字段 columns[i+4], # 当前的列名, columns 是列字段列表
df.iloc[0, i+4], # 第一行,当前列的那个值, 即字段下面那个
df.iloc[j+1, i+4] # j 是不断往下走, 边走边取值
] # 每一次取值, 则作为新数据的一行
ret.append(lst) # 最后再将这个新的二维数据变为 DataFrame, cols 自定义, 存 Excel 即可

之列来一波运行效果呀

完整代码

import pandas as pd 

def get_data(file_path):
"""将Excel读取为DF"""
return pd.read_excel(file_path) def col_to_row(df):
"""多行转多列,返回转好的二维数组"""
columns = df.columns.values
# 需要转置的那部分 DF
row_n = df.shape[0] -1
col_n = df.shape[1] - 4 ret = []
for i in range(col_n):
for j in range(row_n):
# 索引取值 iloc[行索引,列索引] 即可
lst = [
# 先取前四列, j+1 是为了跳过第 2 行
df.iloc[j+1, 0], df.iloc[j+1, 1],
df.iloc[j+1, 2], df.iloc[j+1, 3],
# 再取当前列的, 前两行, 和 对应的值 (i,j) 再来3个字段
columns[i+4],
df.iloc[0, i+4],
df.iloc[j+1, i+4]
]
# 每一次取值, 则作为新数据的一行
ret.append(lst) return ret def save_excel(d2_array, col_names, save_path):
"""将一个二维数组,拼接为DF 再存为Excel"""
pd.DataFrame(d2_array,
columns=col_names).to_excel(
save_path, index=False
) # 主逻辑
data = get_data("D:/test_data/多列转多行.xlsx") # 获取数据
d2_array = col_to_row(data) # 处理数据 col_names = ['name','gender','age', 'major', 'I', 'AM', 'NB']
save_excel(d2_array, col_names, "D:/youge.xlsx") # 存储数据 print("ok!")

然后来看一波, 结果, 从 Excel.

小结

  • 行列转换, 除了用什么 stack(), pivot, melt 之类的, 也有看需求, 暴力来循环的
  • 这个案例关键在于, 两个 for 循环来移动取值(下标) , 类似于, 指针移动在二维数组中
  • 理解原理就行, 多搬砖和收藏点赞才是偷懒的唯一途径

Pandas 实现 Excel 多列 转 多行的更多相关文章

  1. pandas 将excel一列拆分成多列重新保存

    利用pd.read_excel   做到将第二列“EVT-LBL”按“-”分割后重新加三列在df后面 1 读取表格df 2. 分割第二列短横连接的数字,保存到df2---- 参考:str.spilt( ...

  2. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  3. python读取Excel整列或整行数据

    单元格拆分 def get_index(capital): """ 大写字母(Excel列头)转数字 :param capital: 'A' --> 0, 'AA' ...

  4. pandas读取excel中指定数据的行数

    shuju = pd.read_excel(filename) loandata = pd.DataFrame(shuju) ncol = (len(loandata.keys())) data = ...

  5. pandas删除满足特定列信息的行记录

    #!/usr/bin/python import pandas as pd df = pd.read_excel('c:\data\zichan.xlsx') df_sn = pd.read_exce ...

  6. Excel中列宽、行高与像素的换算公式

    DPI             Scale      ColumnWidth             RowHeight 72dpi           75%       cw=(pix-5)/6  ...

  7. 机器学习之数据预处理,Pandas读取excel数据

    Python读写excel的工具库很多,比如最耳熟能详的xlrd.xlwt,xlutils,openpyxl等.其中xlrd和xlwt库通常配合使用,一个用于读,一个用于写excel.xlutils结 ...

  8. pandas 读写excel 操作(按索引和关键字读取行和列,写入csv文件)

    pandas读写excel和csv操作总结 按索引读取某一列的值 按关键字读取某一列的值 按关键字查询某一行的值 保存成字典并写入新的csv import pandas as pd grades=pd ...

  9. Pandas: 如何将一列中的文本拆分为多行? | Python

    Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...

  10. C# 得到EXCEL表格中的有效行数和列数

    每种方法中上面的是Excel的行数,下面的是Excel的列数.方法七:经过加工修改已经可以读出来的是有效数据行 using Excel = Microsoft.Office.Interop.Excel ...

随机推荐

  1. MacOS环境配置Homebrew

    Homebrew笔记 1. 介绍 官网:https://brew.sh/ 对于习惯了使用命令来完成一切的程序员来说,安装软件这种小事,自然是能够用命令解决,就不用图形界面选择.但是在 Linux 中, ...

  2. java stream sorted排序 考虑null值

    项目里使用到排序, java里没有像C# 里的linq,只有stream,查找stream.sorted源码看到有个 Comparator.nullsLast 然后看了一下实现,果然是能够处理null ...

  3. 小米13Pro一键ROOT秒杀全版本

    小米13p专属 通杀全版本 但是必须解开bl锁 小米13pro一键root使用方法: 解锁bl后,不要设置锁屏密码,有的话就取消掉,打开软件,点击安装驱动(管理员) 手机上打开usb调试和usb安装 ...

  4. .NET MCP项目对比分析:MCPSharp、mcpdotnet与ModelContextProtocol.NET

    MCP(Model Context Protocol)协议是一种由Anthropic推出的开放协议,旨在实现大型语言模型(LLM)与外部数据源和工具之间的无缝集成.简要对比分析三个.NET的MCP项目 ...

  5. Zookeeper Java客户端连接慢、超时问题Ad-Hoc检查清单

    TL;DR 排查思路: 首先确认你的设备到zookeeper的连通性是OK的,可通过命令echo srvr | nc HOST 2181,检查是否可以正常打印节点信息.windows用户可以在命令行输 ...

  6. 【Abaqus Case】2D弹塑性接触分析

    2D 弹塑性-接触分析 本案例属于材料非线性+边界条件非线性 问题描述 前处理 材料 *Material, name=steel *Density 7.8e-09, *Elastic 210000., ...

  7. 【Matlab】基于KDtree的最近邻搜索和范围搜索

    摘要:介绍Matlab的rangesearch()函数和knnsearch()函数. rangesearch() -- 根据给定k-维数据集,返回指定距离范围内的所有数据点 knnsearch() - ...

  8. python os.walk函数

    os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下. root 所指的是当前正在遍历的这个文件夹的本身的地址 dirs 是一个 list ,内容是该文件夹中所有的目录的名 ...

  9. [tldr]github仓库添加release

    作为一个开源项目开发者,并且把自己的代码仓库托管到了github上面,所以,可以在github上提供自己的程序的release 这通常是通过二进制可执行文件的方式提供 新建草稿 点击create a ...

  10. go实现协程池管理

    使用channel实现协程池 通过 Channel 实现 Goroutine Pool,缺点是会造成协程的频繁开辟和注销,但好在简单灵活通用. package main import ( " ...