目前正在使用pandas处理数据集。不要对这类东西有太多经验,所以任何帮助都会非常感激。数据集(如下所示):
该表显示了按年份分组的不同细分相关联的评级。我正在尝试解析该表并从其关联年份列(不包括nans)中提取最新评级,并将其应用于Curr_Rate
列中的相应位置以及{{1}中收集评级的年份1}}。
第二项任务是提取第二个最新评级(包含相应年份)并将这些值填充到Curr_RatingYr
和Prev_Rate
字段中。最后,我需要从2000-2017的所有评级中生成平均值。我有平均部分,但当我尝试解析表格以生成当前评级和以前评级的值时,我遇到了:
PrevRatingYr
非常感谢任何帮助。
TypeError stating numpy.float64 object is not callable at index 0
答案 0 :(得分:1)
该错误似乎与您的apply()
语法有关。
apply()
,最后不要()
。例如。 apply(getCurrRate, axis=1)
。 您应用数据的功能通常需要参数,例如getCurrRate(yr)
。在这里,yr
是从apply()
隐式传递的对象,因此axis=1
正在执行:
getCurrRate(dftest.y2000)
getCurrRate(dftest.y2001)
#...
getCurrRate(dftest.y2017)
但如果getCurrRate
定义中没有参数,则apply()
无法应用任何内容。
至少在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
的以下值:
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