TypeError:Numpy.float64对象不可调用迭代行pandas数据帧

时间:2017-08-25 15:42:20

标签: python pandas typeerror pandas-apply

目前正在使用pandas处理数据集。不要对这类东西有太多经验,所以任何帮助都会非常感激。数据集(如下所示):

sample dataset

该表显示了按年份分组的不同细分相关联的评级。我正在尝试解析该表并从其关联年份列(不包括nans)中提取最新评级,并将其应用于Curr_Rate列中的相应位置以及{{1}中收集评级的年份1}}。

第二项任务是提取第二个最新评级(包含相应年份)并将这些值填充到Curr_RatingYrPrev_Rate字段中。最后,我需要从2000-2017的所有评级中生成平均值。我有平均部分,但当我尝试解析表格以生成当前评级和以前评级的值时,我遇到了:

PrevRatingYr

非常感谢任何帮助。

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

1 个答案:

答案 0 :(得分:1)

该错误似乎与您的apply()语法有关。

  1. 使用函数名称调用apply(),最后不要()。例如。 apply(getCurrRate, axis=1)
  2. 您应用数据的功能通常需要参数,例如getCurrRate(yr)。在这里,yr是从apply()隐式传递的对象,因此axis=1正在执行:

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

    但如果getCurrRate定义中没有参数,则apply()无法应用任何内容。

  3. 至少在currRate的情况下,您似乎真的只想要NaN列中最新的非y<year>值。在这种情况下,请考虑一种更简单的方法:

    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的以下值:

    • index 0:2
    • index 1:6
    • index 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