我正在用Python的pandas库处理Excel文件中的一些数据,并从这些数据中创建了两个新的列。我想把这些列添加到Excel文件本身中现有列的最右边,而不影响已经存在的数据。由于这个原因,我不能使用 pd.to_excel()
因为这样会覆盖现有的数据,整个工作表的格式也会丢失。
我正在研究用OpenPyXL来保存新数据(要读两次文件不是很好,但用OpenPyXL处理头文件并把它们传递给pandas对我来说有点乱)。问题是 ws.append()
函数在第一列(A列)的底部插入数据,而我想在第一列(比如说C列和D列)的顶部(第1行)插入数据。理想情况下,这应该从两个 pandas Series 对象(代表新的列)或从我正在工作的整个 pandas DataFrame 中的并列中获取数据。脚本最好能自动找到第一个空单元格,尽管这不是必须的。
有什么想法吗?类似的问题也有人问过 此处但在那里,数据从一个表复制到另一个表,我似乎不能让它为我工作。
示例代码。
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")
Excel文件的例子是一个DataFrame。
One Two
0 a 1
1 b 2
2 c 3
据我所知: dataframe_to_rows()
工作于整个DataFrame,而不是让我从DataFrame中传递一个Pandas系列或仅仅一列。这就是为什么上面的代码将整个DataFrame复制到Excel文件的底部,而我只想在这里得到 df["Three"]
列插入到Excel的C列中,并加上页眉。
好吧,我找到了一个方法(如果你问我,相当丑陋),但它的工作原理。
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")
遗憾的是没有办法检测到工作表中的第一个空列。