2017-07-26 31 views
0

使用Python的表格數據圖書館agate我想定義一個計算Formula,它訪問行索引。我試圖如何訪問瑪瑙公式行索引?

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

但這不起作用,因爲對象不提供(行)指數(不像列對象!)。是否有訪問行索引公式的方法嗎?

(我需要這一點是爲了創造具有獨特的每一行值的新列。)

回答

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))) 
0

這是從功能__doc__

必須爲指定的數據類型返回一個有效的值。 :PARAM投:如果:代碼:True,每個返回值將被轉換爲指定的\ N:代碼:data_type,以確保它是有效的。

這是從offitial教程:

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

+0

的式(輸出)的數據類型是*不*的問題。正如問題中提到的,我的代碼行無效,因爲'r'沒有行索引,但這正是我的問題:如何訪問公式中的行索引*?你的回答根本沒有解決這個問題。 – halloleo

+0

我會更新的答案。在此期間,我開始使用圖書館。 –