首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在添加公式后用熊猫/ xslxwriter对列进行排序

在添加公式后用熊猫/ xslxwriter对列进行排序
EN

Stack Overflow用户
提问于 2019-10-05 09:55:58
回答 1查看 264关注 0票数 1

我有几个列的dataframe,这实际上与这个问题无关,但是我想按特定的顺序对我的列进行排序。

现在,问题是我有一堆引用excel表的公式(我正在用xslxwriter worksheet.add_table创建这些表),例如:

代码语言:javascript
复制
planned_units = '=Table1[@[Spend]]/Table1[@[CP]]'

因此,如果我简单地在熊猫中添加一个列来添加这些公式:

代码语言:javascript
复制
df['newformula'] = planned_units

我认为这是行不通的,因为我在实际添加表之前添加了一个引用表的公式。因此,在添加公式之前对这些列进行排序将无法工作,因为:

  • 稍后我将添加公式(在创建表之后),但我也希望对刚才添加的列进行排序。
  • 如果我在add_table之前添加引用excel表的公式,则这些公式在excel中不能工作

似乎xslxwriter不允许我以任何方式对列进行排序(也许我错了?)因此,在我有了最后的“产品”(在添加了所有包含公式的列之后)之后,我看不到对列进行排序的任何可能性。

与排序列相比,更好的方法是使用工作公式,但我将很高兴地欢迎关于如何在此时对它们进行排序的任何想法。

谢谢!

PS代码示例:

代码语言:javascript
复制
import pandas as pd
import xlsxwriter


# simple dataframe with 3 columns

input_df = pd.DataFrame({'column_a': ['x', 'y', 'z'],
                         'column_b': ['red', 'white', 'blue'],
                         'column_c': ['a', 'e', 'i'],
                         })

output_file = 'output.xlsx'

# formula I want to add
column_concatenation = '=CONCATENATE(Table1[@[column_a]], " ", Table1[@[column_b]])'

# now if adding formulas with pandas would be possible, I would do it like this:

# input_df['concatenation'] = column_concatenation
# but its not possible since excel gives you errors while opening!

# adding excel table with xlsxwriter:

workbook = xlsxwriter.Workbook(output_file)
worksheet = workbook.add_worksheet("Sheet with formula")

# here I would change column order only IF formulas added with pandas would work! so no-no
'''
desired_column_order = ['columnB', 'concatenation', 'columnC', 'columnA']
input_df = input_df[desired_column_order]
'''
data = input_df

worksheet.add_table('A1:D4', {'data': data.values.tolist(),
                              'columns': [{'header': c} for c in data.columns.tolist()] +
                                         [{'header': 'concatenation',
                                           'formula': column_concatenation}
                                          ],
                              'style': 'Table Style Medium 9'})

workbook.close()

现在,在workbook.close()之前,我希望在添加了公式之后,使用该表'desired_column_order‘重新排序我的列。

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-05 17:56:46

这里看起来有两个问题:排序和表公式。

排序是Excel在运行时在Excel应用程序中所做的事情,它不是文件格式的属性,也不是可以触发的内容。因为XlsxWriter只处理文件格式,所以它不能进行任何排序。但是,在用XlsxWriter编写数据之前,可以使用Python/Pandas对数据进行排序。

公式问题是由于Excel具有原始的[#This Row]语法(Excel2007)和后来的@语法(Excel2010+)。参见XlsxWriter在使用工作表.列上的文档

公式中支持Excel2007Style [#This Row]和Excel2010Style @结构引用。但是,其他Excel 2010添加的结构引用不受支持,公式应该符合Excel 2007样式的公式。

因此,基本上您需要使用Excel2007语法,因为这是存储在文件格式中的内容,即使Excel在外部显示Excel2007语法。

当您通过add_table()方法XlsxWriter添加公式时,XlsxWriter会为您进行转换,但是如果您以另一种方式(例如通过Pandas )添加公式,则需要使用Excel2007语法。所以不是这样的公式:

代码语言:javascript
复制
=CONCATENATE(Table1[@[column_a]], " ", Table1[@[column_b]])

您需要添加以下内容:

代码语言:javascript
复制
=CONCATENATE(Table1[[#This Row],[column_a]], " ", Table1[[#This Row],[column_b]])

(您可以看到为什么在以后的Excel版本中使用更短的语法。)

然后,您的程序将按预期工作:

代码语言:javascript
复制
import pandas as pd
import xlsxwriter

input_df = pd.DataFrame({'column_a': ['x', 'y', 'z'],
                         'column_b': ['red', 'white', 'blue'],
                         'column_c': ['a', 'e', 'i'],
                         })

output_file = 'output.xlsx'

column_concatenation = '=CONCATENATE(Table1[[#This Row],[column_a]], " ", Table1[[#This Row],[column_b]])'

input_df['concatenation'] = column_concatenation


workbook = xlsxwriter.Workbook(output_file)
worksheet = workbook.add_worksheet("Sheet with formula")

desired_column_order = ['column_b', 'concatenation', 'column_c', 'column_a']
input_df = input_df[desired_column_order]
data = input_df

# Make the columns wider for clarity.
worksheet.set_column(0, 3, 16)

worksheet.add_table('A1:D4', {'data': data.values.tolist(),
                              'columns': [{'header': c} for c in data.columns.tolist()] +
                                         [{'header': 'concatenation'}],
                              'style': 'Table Style Medium 9'})

workbook.close()

输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58247186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档