2017-08-25 3 views
0

Arbeitet derzeit an einem Dataset mit Pandas. Haben Sie nicht viel Erfahrung mit dieser Art von Sachen, so würde jede Hilfe sehr geschätzt werden. Daten-Set (siehe unten):TypeError: Numpy.float64 Objekt ist nicht aufrufbar Iterationsreihen Pandas Datenrahmen

sample dataset

Die Tabelle zeigt Ratings mit unterschiedlichen Segmenten nach Jahren gruppiert verbunden. Ich versuche, die Tabelle zu analysieren und die neueste Bewertung aus der zugehörigen Jahrespalte (ohne Nans) zu ziehen und sie an der entsprechenden Stelle in der Spalte Curr_Rate zusammen mit dem Jahr anzuwenden, in dem die Bewertung in der Curr_RatingYr erfasst wurde. Die zweite Aufgabe besteht darin, die zweitjüngste Bewertung (mit dem jeweiligen Jahr) zu ziehen und diese Werte in die Felder Prev_Rate und PrevRatingYr aufzufüllen. Schließlich muss ich Durchschnittswerte aus allen verfügbaren Bewertungen 2000-2017 generieren. Ich habe den mittleren Teil nach unten, aber wenn ich versuche, und analysiere, um die Tabellenwerte für Nennstrom zu erzeugen und Zurück Bewertung Ich traf mit:

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

Jede Hilfe wäre sehr geschätzt.

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

Können Sie (a) tatsächlich, Inline-Daten statt ein Screenshot, und (b) der erwartete Eingang und Ausgang ? Allgemeiner gesagt, erhalten Sie bessere Hilfe, wenn Sie ein [minimales, vollständiges und verifizierbares Beispiel] (https://stackoverflow.com/help/mcve) veröffentlichen. –

Antwort

1

scheint der Fehler auf Ihre apply() Syntax verwendet.

  1. Anruf apply() mit einem Funktionsnamen, keine () am Ende. Z.B. apply(getCurrRate, axis=1).
  2. Die Funktion, auf die Sie Ihre Daten anwenden, benötigt normalerweise ein Argument, z. getCurrRate(yr). Hier ist yr das Objekt übergeben implizit aus apply(), so mit axis=1 Sie ausführen würde:

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

    Aber ohne einen Parameter in Ihrer getCurrRate Definition apply() nichts hat, anzuwenden auf.

Zumindest für den Fall von currRate scheint es, wie Sie wirklich nur den letzten, nicht NaN Wert aus den y<year> Spalten mögen.In diesem Fall sollten Sie einen einfacheren Ansatz:

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) 

Hier einige Spielzeug Daten zu demonstrieren:

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 

Wir würden die folgenden Werte für currRate erwarten:

  • Index 0: 2
  • Index 1: 6
  • Index 2: 9

Und das ist, was wir mit dem neuen getCurrRate erhalten:

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 
Verwandte Themen