2017-08-25 34 views
0

當前正在使用pandas處理數據集。沒有太多的經驗,這樣的東西,所以任何幫助將不勝感激。數據集(如下所示):TypeError:Numpy.float64對象不可調用迭代行pandas數據幀

sample dataset

表顯示與由年分組不同片段相關聯的評級。我試圖解析表格並從其相關年份列(不包括nans)中提取最新評級,並將其應用到Curr_Rate列中的相應位置以及在Curr_RatingYr中收集評級的年份。

第二項任務是提取第二個最新評級(各年),並將這些值填入Prev_RatePrevRatingYr字段。最後,我需要根據2000-2017年的所有可用評分生成平均值。我平均下來的部分,但是當我嘗試解析表來產生電流額定值和先前費率值,我會見了:

TypeError stating numpy.float64 object is not callable at index 0 

任何幫助將不勝感激。

df = pd.read_excel('CurrPrevRate1.xlsx') 

df.head() 

dftest = df[:100] 

    # Replace zeros with NaN 
    dftest[['y2000', 'y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']] = dftest[['y2000','y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']].replace(0, np.nan) 

    #Change all values in these columns to floats 
    #dftest[['y2000', 'y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']] = dftest[['y2000', 'y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']].apply(pd.to_numeric) 

    #Get average of rows 
    dftest['AvgRating'] = dftest[['y2000', 'y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']].mean(axis=1) 

    def getCurrRate(): 
     for x in dftest['y2017']: 
      if 0 <= x <= 10: 
       return x 
      else: 
       for y in dftest['y2016']: 
        if 0 <= y <= 10: 
         return y 
        else: 
         for z in dftest['y2015']: 
          if 0 <= z <= 10: 
           return z 
          else: 
           return 'N/A' 

    dftest['Curr_Rate'] = dftest[['y2000', 'y2001', 'y2002', 'y2003', 'y2004', 'y2005', 'y2006','y2007', 'y2008', 'y2009', 'y2010', 'y2011', 'y2012', 'y2013', 'y2014', 'y2015', 'y2016', 'y2017']].apply(getCurrRate(), axis=1) 

    dftest 
+0

你能提供(一)實際,內聯數據替代的截圖,和(b)預期的輸入和輸出?更一般地說,當您發佈[最小化,完整和可驗證示例](https://stackoverflow.com/help/mcve)時,您會發現獲得更好的幫助更快。 –

回答

1

該錯誤與您的apply()語法似乎有關。

  1. 呼叫apply()帶有函數名稱,沒有()結束。例如。 apply(getCurrRate, axis=1)
  2. 你應用你的數據的函數通常需要一個參數, getCurrRate(yr)。在這裏,yrapply()隱含傳遞的對象,因此與axis=1你會執行:

    getCurrRate(dftest.y2000) 
    getCurrRate(dftest.y2001) 
    #... 
    getCurrRate(dftest.y2017) 
    

    但是,如果沒有你的getCurrRate定義參數,apply()不會有什麼應用上。

至少爲currRate的情況下,好像你真的只是想從y<year>列最近,非NaN值。在這種情況下,考慮一個簡單的方法:

def getCurrRate(yr): 
    return yr.dropna()[-1] 

ratings_cols = df.columns[df.columns.str.startswith('y')] 
df['currRate'] = df[ratings_cols].apply(getCurrRate, axis=1) 

下面是一些玩具數據顯示:

data = {'segmentId':['foo','bar','baz'], 
     'y2015':[5, 6, 7], 
     'y2016':[2, np.nan, 4], 
     'y2017':[np.nan, np.nan, 9]} 
df = pd.DataFrame(data) 

df 
    segmentId y2015 y2016 y2017 
0  foo  5 2.0 NaN 
1  bar  6 NaN NaN 
2  baz  7 4.0 9.0 

我們預計以下值currRate

  • 指數0:2
  • 索引1:6
  • 指數2:9

這就是我們得到的新getCurrRate

df['currRate'] = df[ratings_cols].apply(getCurrRate, axis=1) 

df 
    segmentId y2015 y2016 y2017 currRate 
0  foo  5 2.0 NaN  2.0 
1  bar  6 NaN NaN  6.0 
2  baz  7 4.0 9.0  9.0