TypeError: Numpy.float64 object is not callable iterating rows pandas dataframe
TypeError: Numpy.float64 object is not callable iterating rows pandas dataframe
目前正在使用 pandas 处理数据集。对这类事情没有太多经验,因此将不胜感激任何帮助。数据集(如下所示):
table 显示与按年份分组的不同细分相关的评级。我正在尝试解析 table 并从其关联的年份列(不包括 nans)中提取最新评级,并将其应用到 Curr_Rate
列中的相应位置以及收集评级的年份在 Curr_RatingYr
。
第二个任务是提取倒数第二个最近的评级(带有相应的年份)并将这些值填充到 Prev_Rate
和 PrevRatingYr
字段中。最后,我需要从 2000-2017 年的所有可用评级中生成平均值。我的平均部分有所下降,但是当我尝试解析 table 以生成当前评级和先前评级的值时,我遇到了:
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
错误似乎与您的 apply()
语法有关。
- 用函数名调用
apply()
,最后没有()
。例如。 apply(getCurrRate, axis=1)
。
您将数据应用到的函数通常带有一个参数,例如getCurrRate(yr)
。这里,yr
是从 apply()
隐式传递的对象,因此使用 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
目前正在使用 pandas 处理数据集。对这类事情没有太多经验,因此将不胜感激任何帮助。数据集(如下所示):
table 显示与按年份分组的不同细分相关的评级。我正在尝试解析 table 并从其关联的年份列(不包括 nans)中提取最新评级,并将其应用到 Curr_Rate
列中的相应位置以及收集评级的年份在 Curr_RatingYr
。
第二个任务是提取倒数第二个最近的评级(带有相应的年份)并将这些值填充到 Prev_Rate
和 PrevRatingYr
字段中。最后,我需要从 2000-2017 年的所有可用评级中生成平均值。我的平均部分有所下降,但是当我尝试解析 table 以生成当前评级和先前评级的值时,我遇到了:
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
错误似乎与您的 apply()
语法有关。
- 用函数名调用
apply()
,最后没有()
。例如。apply(getCurrRate, axis=1)
。 您将数据应用到的函数通常带有一个参数,例如
getCurrRate(yr)
。这里,yr
是从apply()
隐式传递的对象,因此使用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