首页 > 解决方案 > 将 python 脚本转换为 Spotfire Python 数据函数的问题

问题描述

我有一个非常简单的脚本,分为两个步骤:

  1. 按 A 列和 B 列对数据框进行排序
  2. 创建一个新列 (D),该列是通过在 C 列中使用相同值标记连续行并在每次行值更改时将标签增加 1 并因此标记所有相似数据的连续组。

我的 Python 脚本在下面并且效果很好,我不想将它作为 Python 数据函数引入 Spotfire 并且在将其连接到输入和输出参数时遇到问题。

原始的python脚本

import pandas as pd
import numpy as np
df.sort_values(['ColumnA', 'ColumnB'], ascending=[True, True])
df['ColumnD'] = (df['ColumnC'] != df['ColumnC'].shift(1)).cumsum()

预期产出

我试图将我的数据函数编写为:

import pandas as pd
import numpy as np
df.sort_values([A, B], ascending=[True, True])
D = (C != C.shift(1)).cumsum()

并使 A、B、C “输入”和 D 成为输出,但它不起作用。任何帮助都值得赞赏!

标签: pythonspotfire

解决方案


我正在编辑我之前的答案,因为示例数据已经排序,所以实际问题被隐藏了。Spotfire 假定输出列与输入数据表的顺序相同。如果数据表在数据函数中的排序方式不同,则需要在输出列之前将其排序回其原始顺序。

所以我创建了一个计算列 ROWID: rowid() ,它也输入到数据函数中。这表示行的“自然”顺序。

这是有效的代码:

import pandas as pd
import numpy as np

df=df.sort_values(['A', 'B'], ascending=[True, True])
df['D'] = (df['C'] != df['C'].shift(1)).cumsum()
#re-sort by ROWID before creating the column vector
df=df.sort_values(['ROWID'],ascending=[True])
D=df['D']

推荐阅读