【问题标题】:TypeError: Numpy.float64 object is not callable iterating rows pandas dataframeTypeError:Numpy.float64 对象不可调用迭代行熊猫数据框
【发布时间】:2017-08-26 04:08:19
【问题描述】:

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

该表显示了与按年份分组的不同部分相关的评级。我正在尝试解析该表并从其相关年份列(不包括 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

【问题讨论】:

  • 您能否提供 (a) 实际的内联数据而不是屏幕截图,以及 (b) 预期的输入和输出?更一般地说,当您发布 Minimum, Complete, and Verifiable Example 时,您会发现您会更快地获得更好的帮助。

标签: python pandas typeerror pandas-apply


【解决方案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() 就没有任何可应用的对象。

至少对于currRate 的情况,您似乎真的只想要y&lt;year&gt; 列中最新的非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

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 2020-05-17
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多