TypeError:不能使用带有自定义函数的pandas apply()调用“系列”对象

时间:2018-10-22 19:46:27

标签: python python-3.x pandas dataframe

试图使用Pandas数据框的Apply()函数更新具有该函数的所有行。结果是TypeError

----> 1 df_usnews['AvgMathSAT_IQR'].apply(interquartile(df_usnews))

/anaconda/lib/python3.5/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   2235             values = lib.map_infer(values, boxer)
   2236 
-> 2237         mapped = lib.map_infer(values, f, convert=convert_dtype)
   2238         if len(mapped) and isinstance(mapped[0], Series):
   2239             from pandas.core.frame import DataFrame

pandas/src/inference.pyx in pandas.lib.map_infer (pandas/lib.c:63043)()

TypeError: 'Series' object is not callable

def interquartile(df):
        return pd.to_numeric(df.ThirdQuartileMathSAT) - pd.to_numeric(df.FirstQuartileMathSAT)


q75_upper = np.percentile(df_usnews.AvgMathSAT, q=75, interpolation='higher', axis=0)
q25_lower = np.percentile(df_usnews.AvgMathSAT, q=25, interpolation='lower', axis=0)
interquartile = q75_upper - q25_lower
df_usnews['AvgMathSAT_IQR'] = 0
df_usnews['AvgMathSAT_IQR'].apply(interquartile(df_usnews))

1 个答案:

答案 0 :(得分:2)

修正代码,因为interquartile在DataFrame上运行,所以apply也必须如此。你需要做

df_usnews['AvgMathSAT_IQR'] = df_usnews.apply(interquartile)

请注意,在将函数传递给apply时,它不带参数地传递(即,不被调用)。

感谢pd.to_numeric是矢量化的,因此您无需在此处应用该功能。

df_usnews['AvgMathSAT_IQR'] = interquartile(df_usnews)

或者,

df_usnews['AvgMathSAT_IQR'] = df_usnews.pipe(interquartile)

会快很多。