使用Python的表格数据库agate我想定义一个计算Formula
,它访问行索引。我试过了
agate.Formula(agate.Text(), lambda r: r.index())
但这不起作用,因为Row
对象不提供(行)索引(与Column对象不同!)。有没有办法访问里面的行索引?
(我需要这个来创建一个新列,每行的值都是唯一的。)
答案 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)))