试图使用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))
答案 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)
会快很多。