2017-08-25 4 views
0

現在、pandasを使用してデータセットを処理しています。この種のもので多くの経験を持っていないので、どんな助けも大歓迎です。データセット(以下に示す):TypeError:Numpy.float64オブジェクトは呼び出し可能ではありません。反復行pandasデータフレーム

sample dataset

テーブル年でグループ化された異なるセグメントに関連付けられた評価を示しています。私はテーブルを解析し、関連付けられた年の列(ナンを除く)から最新の評価を引き出して、Curr_Rateの列のそれぞれの場所に、評価が収集された年と共にCurr_RatingYrに適用しようとしています。

2番目のタスクは、2番目に最近の評価を(それぞれの年で)取り込み、これらの値をPrev_RatePrevRatingYrフィールドに入力することです。最後に、利用可能なすべてのレーティングから平均を生成する必要があります。私は平均的な部分を下にありますが、私がしようとすると現在の評価と前の評価のための値を生成するために、テーブルを解析するとき、私はと会っています:

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

は、あなたの代わりにスクリーンショットの(a)は実際、インラインデータを提供し、(b)は、入力と出力を期待できます?より一般的には、[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)を投稿すると、より迅速に、より良いヘルプを得ることができます。 –

答えて

1

エラーは、apply()の構文に関連しているようです。関数名を持つ

  1. コールapply()、最後には何の()。例えば。 apply(getCurrRate, axis=1)
  2. データを適用する関数は、通常、引数をとります。たとえば、次のようになります。 getCurrRate(yr)。ここaxis=1であなたが実行しているはずだので、yrは、apply()から暗黙的に渡されたオブジェクトです:

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

    をしかし、あなたのgetCurrRate定義では、パラメータなしで、apply()は上の適用には何もありません。あなたは本当にただy<year>列からの最も最近の、非NaN値をしたいよう

は、少なくともcurrRateの場合のために、それはそうです。その場合には、単純なアプローチを検討してください。

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 
関連する問題