首页 > 其他分享 >Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值

Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值

时间:2024-03-26 23:00:50浏览次数:38  
标签:Index MultiIndex df excel writer 写入 pd2 sheetName pd

Pandas操作MultiIndex合并行列的excel,写入读取以及写入多余行及Index列处理

今天是谁写Pandas的 复合索引MultiIndex,写的糊糊涂涂,晕晕乎乎。
是我呀…

记录下,现在终于灵台清明了。
明天在记录下直接用 openpyxl 生成合并单元格,事半功倍。
跟在Java一样,可以参考之前的博客:Java Excel导出复杂excel表格样式之ExcelUtil工具类

1. 效果图及问题

可以生成MultiIndex列的excel,但是输出会多index列及第3行多一行空行,如下图所示:

在这里插入图片描述

A列Index和第3行 都只是隐藏,并没有真正删除
writer.sheets[sheetName].set_row(2, None, None, {‘hidden’: True}) # 删除表格第3行空白行
writer.sheets[sheetName].set_row(2, 0) # 或者设置高度为0,效果图如下:

在这里插入图片描述

真正删除需要用openpyxl
wb._sheets[0].delete_rows(3) # 删除表格第3行空白行,效果图如下:

在这里插入图片描述

原始及openpyxl 最终效果:对比图如下:

在这里插入图片描述

构造一个pd Wooksheet,在第2行插入一条数据,效果图如下:
在这里插入图片描述

修改某个单元格的值:效果图可以看到成功修改

在这里插入图片描述

2. 源码

注意:openpyxl行数从1开始,pd.ExcelWriter行数从0开始

# 生成合并行列的MultiIndex数据,表格插入行
# python multiIndexPandas.py

# https://blog.csdn.net/HQ1356466973/article/details/83588993
import numpy as np
import openpyxl
import pandas as pd


# pandas 插入行
def insertRows(df, cnt, df_add):
    dfStart = df[0:cnt]
    dfEnd = df[cnt:]
    return pd.concat([dfStart, df_add, dfEnd])


# fileName 文件名称,
# argument 是否需要生成index列
def write2ExcelOrigin(fileName, argument='False'):
    writer = pd.ExcelWriter(fileName, engine='xlsxwriter')  # 可以实现将多个dataframe按不同sheet,保存在一个excel中。

    sheetName = 'Sheet1'
    if (argument == 'True'):
        df_all.to_excel(writer, sheet_name=sheetName)
        pd2.to_excel(writer, sheet_name='table')
    elif (argument == 'False'):
        df_all.to_excel(writer, sheet_name=sheetName, startcol=-2)
        pd2.to_excel(writer, sheet_name='table', startcol=-1)

    # # startcol=-1 可以不输出index列
    # df_all.to_excel(writer, sheet_name=sheetName, startcol=-2)
    # pd2.to_excel(writer, sheet_name='table', startcol=-1)
    # writer.sheets[sheetName].set_column(0, 0, None, None, {'hidden': True})  # 删除表格第一列
    #
    # # 第3行 都只是隐藏,并没有真正删除
    # writer.sheets[sheetName].set_row(2, None, None, {'hidden': True})  # 删除表格第3行空白行
    # # 或者设置高度为0
    # writer.sheets[sheetName].set_row(2, 0)

    writer._save()


index = pd.MultiIndex.from_product([['广东', '广西'], [2017, 2018]], names=['province', 'year'])
columnMultiIndex = pd.MultiIndex.from_product([['IT行业', '制造业'], ['软件', '硬件']], names=['行业', '岗位'])
data = np.random.randint(100, 2000, size=(4, 4))
df_all = pd.DataFrame(data, index=index, columns=columnMultiIndex)
print(df_all)

df2Data = np.random.randint(100, 2000, size=(3, 9))
columnName = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
pd2 = pd.DataFrame(df2Data, columns=[['Tables'] * 3 + ['Attrs'] * 6, columnName])

valList = ['a', 'b', 'c']
valList.extend(np.zeros((len(columnName) - 3), dtype=str).tolist())
print(valList)

# pandas插入一行
df_add = pd.DataFrame(columns=pd2.columns, data=[valList])

# 在第2行插入数据 ['a', 'b', 'c', '', '', '', '', '', '']
pd2 = insertRows(pd2, 2, df_add)

# pandas修改某行某个单元格的值
pd2.loc[1, pd2.columns.values[0]] = '999999'
pd2.loc[3, pd2.columns.values[-1]] = 'Marvelous'

fileName = 'excel/multiIndex.xlsx'
write2ExcelOrigin(fileName, argument='False')
write2ExcelOrigin(fileName.replace(".xlsx", "0.xlsx"))

# 需要用openpyxl删除多余的第3行
wb = openpyxl.load_workbook(fileName)  # 获取表格文件

# 批量修改多个sheet
wb._sheets[0].delete_rows(3)  # 删除表格第3行空白行
wb._sheets[1].delete_rows(3)  # 删除表格第3行空白行
wb.save(filename=fileName.replace(".xlsx", "_.xlsx"))

参考

标签:Index,MultiIndex,df,excel,writer,写入,pd2,sheetName,pd
From: https://blog.csdn.net/qq_40985985/article/details/137026987

相关文章

  • 缓存更新-- 穿透/击穿/雪崩 django-celery-flower Celery的应用///如何不重
    缓存 缓存更新策略#如果内存中redis数据满了,再继续往里存数据,redis会触发缓存更新的策略#有如下几种LRU/LFU/FIFO算法剔除:例如maxmemory-policy(到了最大内存,对应的应对策略)#LRU-LeastRecentlyUsed,没有被使用时间最长的#LFU-LeastFrequentyUser,一定时间段内......
  • PhpStrom启动报错, java.net.BindException: Address already in use: bind
    问题描述:今天启动phpstromIDE时,突然报错,报错信息如下图:问题分析1.不正确关闭应用(强制关闭):可能是之前启动了一个本地web服务占了端口,在没有停掉服务,直接关闭IDE导致的(尝试了重启电脑也没解决)2.其他应用占用端口:安装了Hyper-V导致端口被占用?显然我的是第一种情况问题解决......
  • vue2 在 main.js 中定义全局函数,在二次封装的 api\index.js 中引用全局函数 GPT4 Tur
    在Vue2中,你可以通过Vue的原型系统来定义全局函数,然后在整个应用的任何组件中使用这些函数。同样,你也可以在其他JavaScript文件中使用这些函数,比如你提到的二次封装的API文件。下面是如何实现这一过程的步骤:###第一步:在`main.js`中定义全局函数在Vue项目的入口文件`main.js`中,你......
  • 自己编译RustDesk,并将自建ID服务器和key信息写入客户端
    前言:搭建RustDesk编译环境    今天总算是把编译环境给折腾清楚了,编译出来了至少能用,但说不上好用,问题还不少,官方的客户端就是要手工填写ID服务器地址和key才可以用,而且还容易被别人白嫖你搭建的服务器,当然如果拿到你编译后的客户端,也是存在被白嫖的可能。这方面还没......
  • 西门子PLC常用底层逻辑块分享_模拟量写入
    文章目录前言一、功能概述二、模拟量写入程序编写1.创建自定义数据类型2.创建FC块“模拟量写入”3.编写程序前言本文分享一个自己编写的模拟量写入逻辑块。一、功能概述常用于阀门开度或者电机转速设置。二、模拟量写入程序编写1.创建自定义数据类型2.创建F......
  • ArrayIndexOutOfBoundException and NegativeArraySizeException in Java
    ArrayIndexOutOfBoundExceptionArrayIndexOutOfBoundsException occurswhenweaccessanarray,ora Collection,thatisbackedbyanarraywithaninvalidindex. Thismeansthattheindexiseitherlessthanzeroorgreaterthanorequaltothesizeofthe......
  • 【RAG实践】基于 LlamaIndex 和Qwen1.5搭建基于本地知识库的问答机器人
    什么是RAGLLM会产生误导性的“幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。正是在这样的背景下,检索增强生成技术(Retrieval-AugmentedGeneration,RAG)应时而生,成为AI时代的一大趋势。RAG通过在语言模型生成答案......
  • 写入和读取剪切板内容
    写入剪切板使用clipboard.js第三方插件:clipboard.js安装clipboard.jsyarnyarnaddclipboardnpmnpminstallclipboard--save使用示例(vue)<template> <div> <spanv-copy>复制这段文本</span></div></template><script>importC......
  • Yolov9报错“IndexError: list index out of range”方法解决
     哈喽友友们好!今天继续分享关于yolov9的使用教程。 在使用yolov9的数据集时,你是否有类似的报错?如图作者本人一直查找问题,开始是想着数据集标签可能有问题,于是就更换数据集直到适合为止。但发现很多数据集还是会报这个错,只有少部分才能运行,这个方法治标不治本。 于是......
  • jmeter 把响应结果数据写入指定txt文件
    需要把登陆接口返回的token提取出来,保存到一个文件里给其它接口用。登陆接口响应如下在登陆接口取样器下添加"JSON提取器",提取token 在登陆接口取样器下添加"BeanShell后置处理程序" 代码如下://指定需要定稿到哪个文件,格式:TXT,CSVFileWriterfile......