如何将数据帧附加到 for 循环中的不同 excel 工作表
how to append dataframes to different excel sheets in for loop
我有一个问题,一开始看起来很容易解决,但现在我很困惑,因为我仍然无法解决。
我有这段代码 returns for 循环中有几个不同的数据帧,我需要在不同的 excel 工作表上附加不同的 dfs。
说清楚:
- 在 for 循环中我得到 df_a、df_b 等。我需要在循环的第一次迭代中创建文件并将数据写入不同的 excel 工作表。 df_a 到 sheet_a、df_b 到 sheet_b 等
- 在第二次迭代时,我需要以附加模式打开该文件并将第二个 df_a 附加到 sheet_a,第二个 df_b 附加到 sheet_b。
注意:我不想在每次需要保存数据帧时都使用with open之类的东西,因为如果可以的话,它们有很多。
我已经做了:
使用 openpyexcel:
#with pd.ExcelWriter("test.xlsx", engine="openpyxl", mode="a") as writer_test:
for i in range(3):
with pd.ExcelWriter("test.xlsx", engine="openpyxl", mode="a") as writer_test:
a.to_excel(writer_test, sheet_name="name")
b.to_excel(writer_test, sheet_name="b")
writer_test.save()
这两种方式都是 returns 一个 Excel 文件,其中包含工作表名称、b、名称 1、b1、名称 2、b2,数据分开。
不指定引擎:
#with pd.ExcelWriter("test.xlsx", mode="A") as writer_test:
对于我在范围内(3):
pd.ExcelWriter("test.xlsx", mode="A") 作为 writer_test:
a.to_excel(writer_test, sheet_name="姓名")
b.to_excel(writer_test, sheet_name="b")
writer_test.save()
这只是覆盖数据,returns 只是最后一次迭代。
再次尝试 openpyexcel
:
wb = load_workbook('test.xlsx', read_only=False)
for i in range(3):
ws = ["mysheet1", "mysheet2"]
for ws_name in ws:
if ws_name in wb.get_sheet_names():
ws_mysheet1 = wb["mysheet1"]
else:
ws_mysheet1 = wb.create_sheet() # insert at first position
ws_mysheet1.title = ws_name
ws_mysheet1 = wb["mysheet1"]
ws_mysheet2 = wb["mysheet2"]
ws_mysheet1.append(a)
ws_mysheet2.append(b)
这不允许我保存数据帧并且returns一个错误
TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'pandas.core.frame.DataFrame'>
我也试过这个:
for i in range(3):
#with open(writer_test, 'a') as f:
#a.to_excel(writer_test, 'a')
#b.to_excel(writer_test, 'b')
if os.path.exists('test.xlsx'):
append_write = 'a' # append if already exists
else:
append_write = 'w' # make a new file if not
highscore = open('test.xlsx',append_write)
highscore.write(a + '\n', 'a')
highscore.write(a + '\n', 'b')
highscore.close()
这会导致另一个错误:
TypeError: write() takes exactly one argument (2 given)
我尝试了其他一些方法,但它们也不起作用。非常感谢任何帮助。
import pandas as pd
df = pd.util.testing.makeDataFrame()
df = df.head()
file = 'output.xlsx'
sheet_name = 'test'
for i in range(3):
if i == 0:
df.to_excel(file, sheet_name=sheet_name, index=False)
else:
read_data = pd.read_excel(file,sheet_name=sheet_name)
merge_data = pd.concat([df, read_data])
merge_data.to_excel(file, sheet_name=sheet_name, index=False)
我有一个问题,一开始看起来很容易解决,但现在我很困惑,因为我仍然无法解决。
我有这段代码 returns for 循环中有几个不同的数据帧,我需要在不同的 excel 工作表上附加不同的 dfs。
说清楚:
- 在 for 循环中我得到 df_a、df_b 等。我需要在循环的第一次迭代中创建文件并将数据写入不同的 excel 工作表。 df_a 到 sheet_a、df_b 到 sheet_b 等
- 在第二次迭代时,我需要以附加模式打开该文件并将第二个 df_a 附加到 sheet_a,第二个 df_b 附加到 sheet_b。
注意:我不想在每次需要保存数据帧时都使用with open之类的东西,因为如果可以的话,它们有很多。
我已经做了:
使用 openpyexcel:
#with pd.ExcelWriter("test.xlsx", engine="openpyxl", mode="a") as writer_test:
for i in range(3):
with pd.ExcelWriter("test.xlsx", engine="openpyxl", mode="a") as writer_test:
a.to_excel(writer_test, sheet_name="name")
b.to_excel(writer_test, sheet_name="b")
writer_test.save()
这两种方式都是 returns 一个 Excel 文件,其中包含工作表名称、b、名称 1、b1、名称 2、b2,数据分开。
不指定引擎:
#with pd.ExcelWriter("test.xlsx", mode="A") as writer_test:
对于我在范围内(3): pd.ExcelWriter("test.xlsx", mode="A") 作为 writer_test: a.to_excel(writer_test, sheet_name="姓名") b.to_excel(writer_test, sheet_name="b") writer_test.save()
这只是覆盖数据,returns 只是最后一次迭代。
再次尝试 openpyexcel
:
wb = load_workbook('test.xlsx', read_only=False)
for i in range(3):
ws = ["mysheet1", "mysheet2"]
for ws_name in ws:
if ws_name in wb.get_sheet_names():
ws_mysheet1 = wb["mysheet1"]
else:
ws_mysheet1 = wb.create_sheet() # insert at first position
ws_mysheet1.title = ws_name
ws_mysheet1 = wb["mysheet1"]
ws_mysheet2 = wb["mysheet2"]
ws_mysheet1.append(a)
ws_mysheet2.append(b)
这不允许我保存数据帧并且returns一个错误
TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'pandas.core.frame.DataFrame'>
我也试过这个:
for i in range(3):
#with open(writer_test, 'a') as f:
#a.to_excel(writer_test, 'a')
#b.to_excel(writer_test, 'b')
if os.path.exists('test.xlsx'):
append_write = 'a' # append if already exists
else:
append_write = 'w' # make a new file if not
highscore = open('test.xlsx',append_write)
highscore.write(a + '\n', 'a')
highscore.write(a + '\n', 'b')
highscore.close()
这会导致另一个错误:
TypeError: write() takes exactly one argument (2 given)
我尝试了其他一些方法,但它们也不起作用。非常感谢任何帮助。
import pandas as pd
df = pd.util.testing.makeDataFrame()
df = df.head()
file = 'output.xlsx'
sheet_name = 'test'
for i in range(3):
if i == 0:
df.to_excel(file, sheet_name=sheet_name, index=False)
else:
read_data = pd.read_excel(file,sheet_name=sheet_name)
merge_data = pd.concat([df, read_data])
merge_data.to_excel(file, sheet_name=sheet_name, index=False)