Python 使用pandas在保持格式的同时覆盖excel列

Python 使用pandas在保持格式的同时覆盖excel列,python,pandas,Python,Pandas,我正在处理一个xlsx文件,该文件如下所示: 我以前的任务是修改名为“条目1”和“条目2”的列。我已经将这些列存储在原始数据帧的一个单独部分中,以便更好地进行概述。我将让您快速了解一下这一片的外观: >>> slice = df.loc[:, 'Entry 1':'Entry 2'] # code to modify the values >>> slice Entry 1 Entry 2 1 Modified 1 Value 1 2

我正在处理一个xlsx文件,该文件如下所示:

我以前的任务是修改名为“条目1”和“条目2”的列。我已经将这些列存储在原始数据帧的一个单独部分中,以便更好地进行概述。我将让您快速了解一下这一片的外观:

>>> slice = df.loc[:, 'Entry 1':'Entry 2']
# code to modify the values
>>> slice

    Entry 1     Entry 2
1   Modified 1  Value 1
2   Modified 2  Value 2
3   Modified 3  Value 3 
现在我想用命名的切片覆盖原始数据帧中的那些列。我已经通过以下方法实现了这一点:

df.loc[:, 'Entry1':'Entry2'] = slice
from StyleFrame import StyleFrame

sf = StyleFrame.read_excel('test.xlsx', read_style=True)
# currently you have to specify each value manually,
# using slices will revert to the default style used by StyleFrame
sf.loc[0, 'Entry 1'].value = 'Modified 1'
sf.loc[1, 'Entry 1'].value = 'Modified 2'
sf.loc[2, 'Entry 1'].value = 'Modified 3'
sf.to_excel('test.xlsx').save()
# It is also possible to write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',
             startrow=1, startcol=2, header=False, index=False)
问题
如您所见,列的标题具有特殊格式。如何覆盖“Entry1”和“Entry2”中的值,不包括标题,以保持格式?

完全公开:我是建议库的作者

不幸的是,
pandas
中没有现成的方法来实现这一点,因为它不加载样式数据。您可以使用(包装了
pandas
openpyxl
,我假设您已经安装了它们)来读取xlsx文件,同时保留(大多数)样式元素

在这种情况下使用它可能如下所示:

df.loc[:, 'Entry1':'Entry2'] = slice
from StyleFrame import StyleFrame

sf = StyleFrame.read_excel('test.xlsx', read_style=True)
# currently you have to specify each value manually,
# using slices will revert to the default style used by StyleFrame
sf.loc[0, 'Entry 1'].value = 'Modified 1'
sf.loc[1, 'Entry 1'].value = 'Modified 2'
sf.loc[2, 'Entry 1'].value = 'Modified 3'
sf.to_excel('test.xlsx').save()
# It is also possible to write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',
             startrow=1, startcol=2, header=False, index=False)
使用循环的另一个备选方案:

sf = StyleFrame.read_excel('test.xlsx', read_style=True, use_openpyxl_styles=False)
new_values = ['Modified 1', 'Modified 2', 'Modified 3']
for cell, new_value in zip(sf['Entry 1'], new_values):
    cell.value = new_value
sf.to_excel('test.xlsx').save()
执行前的
test.xlsx
内容:

及之后:


完全披露:我是建议图书馆的作者

不幸的是,
pandas
中没有现成的方法来实现这一点,因为它不加载样式数据。您可以使用(包装了
pandas
openpyxl
,我假设您已经安装了它们)来读取xlsx文件,同时保留(大多数)样式元素

在这种情况下使用它可能如下所示:

df.loc[:, 'Entry1':'Entry2'] = slice
from StyleFrame import StyleFrame

sf = StyleFrame.read_excel('test.xlsx', read_style=True)
# currently you have to specify each value manually,
# using slices will revert to the default style used by StyleFrame
sf.loc[0, 'Entry 1'].value = 'Modified 1'
sf.loc[1, 'Entry 1'].value = 'Modified 2'
sf.loc[2, 'Entry 1'].value = 'Modified 3'
sf.to_excel('test.xlsx').save()
# It is also possible to write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',
             startrow=1, startcol=2, header=False, index=False)
使用循环的另一个备选方案:

sf = StyleFrame.read_excel('test.xlsx', read_style=True, use_openpyxl_styles=False)
new_values = ['Modified 1', 'Modified 2', 'Modified 3']
for cell, new_value in zip(sf['Entry 1'], new_values):
    cell.value = new_value
sf.to_excel('test.xlsx').save()
执行前的
test.xlsx
内容:

及之后:

最终答案 为使probs找到一种更广泛的解决方案,该解决方案将适用于许多途经的乘客


但对我来说,这足以满足我的需要。您所需要做的就是写回原始文件,只需从“row 1”(因为第一行标记为“row 0”)开始,并放出标题和索引。在我的情况下,您可以通过以下方式实现这一点:

df.loc[:, 'Entry1':'Entry2'] = slice
from StyleFrame import StyleFrame

sf = StyleFrame.read_excel('test.xlsx', read_style=True)
# currently you have to specify each value manually,
# using slices will revert to the default style used by StyleFrame
sf.loc[0, 'Entry 1'].value = 'Modified 1'
sf.loc[1, 'Entry 1'].value = 'Modified 2'
sf.loc[2, 'Entry 1'].value = 'Modified 3'
sf.to_excel('test.xlsx').save()
# It is also possible to write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',
             startrow=1, startcol=2, header=False, index=False)
最终答案 为使probs找到一种更广泛的解决方案,该解决方案将适用于许多途经的乘客


但对我来说,这足以满足我的需要。您所需要做的就是写回原始文件,只需从“row 1”(因为第一行标记为“row 0”)开始,并放出标题和索引。在我的情况下,您可以通过以下方式实现这一点:

df.loc[:, 'Entry1':'Entry2'] = slice
from StyleFrame import StyleFrame

sf = StyleFrame.read_excel('test.xlsx', read_style=True)
# currently you have to specify each value manually,
# using slices will revert to the default style used by StyleFrame
sf.loc[0, 'Entry 1'].value = 'Modified 1'
sf.loc[1, 'Entry 1'].value = 'Modified 2'
sf.loc[2, 'Entry 1'].value = 'Modified 3'
sf.to_excel('test.xlsx').save()
# It is also possible to write the dataframe without the header and index.
df4.to_excel(writer, sheet_name='Sheet1',
             startrow=1, startcol=2, header=False, index=False)

你用的是像xl翅膀这样的东西吗?Pandas不存储关于数据的那种格式信息——最好的办法是写回原始文件,从第2行开始。我也这么认为。我如何做到这一点?您是否使用了xl wings之类的产品?Pandas不存储关于数据的那种格式信息——最好的办法是写回原始文件,从第2行开始。我也这么认为。我如何做到这一点?