如何在玛瑙公式中访问行索引?

时间:2017-07-26 06:56:15

标签: python row

使用Python的表格数据库agate我想定义一个计算Formula,它访问行索引。我试过了

agate.Formula(agate.Text(), lambda r: r.index())

但这不起作用,因为Row对象不提供(行)索引(与Column对象不同!)。有没有办法访问里面的行索引

(我需要这个来创建一个新列,每行的值都是唯一的。)

2 个答案:

答案 0 :(得分:0)

这来自函数__doc__

必须返回指定数据类型的有效值。 :param cast:if:code:True,每个返回值都将转换为指定的\ n:code:data_type以确保它有效。

这是来自官方教程:

number_type = agate.Number()

def five_year_total(row):
    columns = ('2009', '2010', '2011', '2012', '2013')

    return sum(tuple(row[c] for c in columns)]

formula = agate.Formula(number_type, five_year_total)

new_table = table.compute([
    ('five_year_total', formula)
])

根据这两个判断,我会说你的数据类型错误,index()函数返回一个对象类型int你的text()。 尝试使用停靠栏agate.Number()中的那个。 我使用的教程是http://agate.readthedocs.io/en/1.6.0/cookbook/excel.html#simple-formulas

答案 1 :(得分:0)

从我的研究中我得出结论,在标准Formula的功能中,无法访问行号。 (当然,我很高兴被证明是错的!)

然而,为了实现问题中的问题我可以继承Formula,更改被调用函数的签名,将行号添加为参数:

class EnumeratedFormula(agate.Formula):
    """
    An agate formula which provides a row index to its compute function
    The function used has now the signature f(i,r)
    """
    def run(self, table):
        new_column = []

        for i, row in enumerate(table.rows):
            v = self._func(i,row)

            if self._cast:
                v = self._data_type.cast(v)

            new_column.append(v)

        return new_column

有了这个,我可以编写一个计算表达式,它创建一个新列,每行有唯一的唯一值:

EnumeratedFormula(agate.Text(), lambda i, r: str(i)))