我正在处理一个看起来像这样的 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
问题
如您所见,列的标题具有特殊格式。如何覆盖“Entry1”和“Entry2”中的值,不包括 header ,以保持格式?
请您参考如下方法:
完全披露:我是建议库的作者
不幸的是,pandas 中没有开箱即用的方法来实现这一点,因为它不加载样式数据。您可以使用 StyleFrame (包装了 pandas 和 openpyxl,我假设您已经安装了它们)可以读取 xlsx 文件,同时保留(大部分)样式元素。
在这种情况下使用它可能如下所示:
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()
另一种使用循环的方法:
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执行前的内容:
及之后:
