将 pandas Series 或 DataFrame 列插入现有 Excel 文件的第一个空列(使用 OpenPyXL?)

Posted

技术标签:

【中文标题】将 pandas Series 或 DataFrame 列插入现有 Excel 文件的第一个空列(使用 OpenPyXL?)【英文标题】:Insert pandas Series or DataFrame column into existing Excel file's first empty column (with OpenPyXL?) 【发布时间】:2020-07-21 19:30:53 【问题描述】:

我正在使用 Python 的 pandas 库处理 Excel 文件中的一些数据,并从这些数据中创建两个新列。我想在 Excel 文件本身的现有列的​​最右侧添加这些列,而不会弄乱已经存在的数据。由于这个原因,我不能使用pd.to_excel(),因为这会覆盖现有数据并且整个工作表都会失去其格式。

我正在研究 OpenPyXL 以保存新数据(不必两次读取文件并不好,但使用 OpenPyXL 处理标头并将它们传递给 pandas 对我来说看起来有点混乱)。问题是ws.append() 函数在第一列(A 列)的底部插入数据,我想在第一个可用的空闲列的顶部(第 1 行)执行此操作(例如列 C 和 D )。理想情况下,这应该从两个 pandas Series 对象(代表新列)或我正在处理的整个 pandas DataFrame 的连接列中获取数据。并且最好脚本应该自动找到第一个空单元格,尽管这不是强制性的。

有什么想法吗? here 有人问过类似的问题,但是数据从一张纸复制到另一张纸,我似乎无法让它为我工作。

示例代码:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows
df = pd.read_excel("file.xlsx")
# New column:
df["Three"] = df["Two"].apply(lambda x: x**2)
# Saving:
file = load_workbook(filename="file.xlsx")
sheet = file["Sheet1"]
for row in dataframe_to_rows(df["Three"], index=False, header=True):
    sheet.append(row)
file.save("file.xlsx")

作为 DataFrame 的示例 Excel 文件:

   One  Two
0    a    1
1    b    2
2    c    3

据我了解,dataframe_to_rows() 与整个 DataFrame 一起使用,并且不允许我传入 pandas Series 或 DataFrame 中的一列。这就是为什么上面的代码将整个 DataFrame 复制到 Excel 文件的底部,我只想将 df["Three"] 列插入 Excel 的 C 列,并带有标题。

【问题讨论】:

【参考方案1】:

好的,我找到了一种方法(如果你问我,这很丑),但它有效。

sheet["C"]
for i, val in df["Three"].items():
    sheet["C".format(i+2)].value = val
sheet["C1"].value = df.columns[2]
file.save("test.xlsx")

遗憾的是无法检测工作表中的第一个空列。

【讨论】:

以上是关于将 pandas Series 或 DataFrame 列插入现有 Excel 文件的第一个空列(使用 OpenPyXL?)的主要内容,如果未能解决你的问题,请参考以下文章

将多个过滤器应用于 pandas DataFrame 或 Series 的有效方法

将 pandas Series 或 DataFrame 列插入现有 Excel 文件的第一个空列(使用 OpenPyXL?)

Python数据分析 Pandas模块 基础数据结构与简介

将项目添加到 pandas.Series?

Pandas Dataframe 和 Series 连接返回空 Dataframe 或 NaN 列

pandas.series.rolling.apply 方法似乎将 Series 隐式转换为 numpy 数组