升级Anaconda后IQR计算代码出现FutureWarning的解决咨询
问题背景
用于机器学习回归分析的DataFrame IQR计算代码,在升级Anaconda后出现FutureWarning,提示直接对单元素Series调用int()已被弃用,未来会触发TypeError。
原代码
#Checking different percentiles pd.DataFrame(MyData['Age']).describe(percentiles=(1,0.99,0.9,0.75,0.5,0.3,0.1,0.01)) #Checking Outlier by definition and treating outliers #Getting median age Age_col_df = pd.DataFrame(MyData['Age']) Age_median = Age_col_df.median() #Getting IQR of Age column Q3 = Age_col_df.quantile(q=0.75) Q1 = Age_col_df.quantile(q=0.25) IQR = Q3-Q1 #Deriving boundaries of Outliers IQR_LL = int(Q1 - 1.5*IQR) IQR_UL = int(Q3 + 1.5*IQR) #Finding and treating outliers - both lower and upper end MyData.loc[MyData['Age']>IQR_UL , 'Age'] = int(Age_col_df.quantile(q=0.90)) MyData.loc[MyData['Age']<IQR_LL , 'Age'] = int(Age_col_df.quantile(q=0.01))
警告信息(中文翻译)
C:\Users\danie\AppData\Local\Temp\ipykernel_19008\1214848077.py:13: FutureWarning: 直接对单元素Series调用int()已被弃用,未来会触发TypeError。请改用int(ser.iloc[0])
C:\Users\danie\AppData\Local\Temp\ipykernel_19008\1214848077.py:14: FutureWarning: 直接对单元素Series调用int()已被弃用,未来会触发TypeError。请改用int(ser.iloc[0])
C:\Users\danie\AppData\Local\Temp\ipykernel_19008\1214848077.py:17: FutureWarning: 直接对单元素Series调用int()已被弃用,未来会触发TypeError。请改用int(ser.iloc[0])
C:\Users\danie\AppData\Local\Temp\ipykernel_19008\1214848077.py:18: FutureWarning: 直接对单元素Series调用int()已被弃用,未来会触发TypeError。请改用int(ser.iloc[0])
修复方案
根据警告提示,将所有直接对单元素Series调用int()的位置,改为通过.iloc[0]取出Series中的唯一元素后再转换为int类型。
修改后的代码
#Checking different percentiles pd.DataFrame(MyData['Age']).describe(percentiles=(1,0.99,0.9,0.75,0.5,0.3,0.1,0.01)) #Checking Outlier by definition and treating outliers #Getting median age Age_col_df = pd.DataFrame(MyData['Age']) Age_median = Age_col_df.median() #Getting IQR of Age column Q3 = Age_col_df.quantile(q=0.75) Q1 = Age_col_df.quantile(q=0.25) IQR = Q3-Q1 #Deriving boundaries of Outliers IQR_LL = int((Q1 - 1.5*IQR).iloc[0]) IQR_UL = int((Q3 + 1.5*IQR).iloc[0]) #Finding and treating outliers - both lower and upper end MyData.loc[MyData['Age']>IQR_UL , 'Age'] = int(Age_col_df.quantile(q=0.90).iloc[0]) MyData.loc[MyData['Age']<IQR_LL , 'Age'] = int(Age_col_df.quantile(q=0.01).iloc[0])
说明
Q1、Q3以及分位数计算结果都是单元素Series,直接调用int()会触发警告,必须先通过.iloc[0]提取具体数值- 修改后代码逻辑与原代码完全一致,仅调整了数值提取方式,避免版本兼容问题
内容的提问来源于stack exchange,提问作者2019Block

