Pandas DataFrame 设置不兼容 dtype 警告问题求助
问题详情
收到的警告信息:
"Setting an item of incompatible dtype is deprecated and will raise an error in a future version of pandas. Value '[149.7 149.7 149.7 149.7]' has dtype incompatible with float64, please explicitly cast to a compatible dtype first. df1.loc[tmp_idx_start:tmp_idx_start+tmp_idx-1, 'AuM'] = (feesPrefinancing.loc[:tmp_idx-1, 'Fees'] + feesMobiDeferred.loc[:tmp_idx-1, 'Fees'] + feesLTQDeferred.loc[:tmp_idx-1, 'Fees']).values "
当前代码:
df1['Date'] = pd.to_datetime(pd.date_range(simulationDate, end=feesLTQDeferred['Valuation date'].iloc[-1], freq='MS', inclusive='both').date) df1['AuM'] = 0. df1.loc[4:7, 'AuM'] = (feesPrefinancing.loc[:3, 'Fees'] + feesMobiDeferred.loc[:3, 'Fees'] + feesLTQDeferred.loc[:3, 'Fees']).values df1.loc[8:, 'AuM'] = (annuities['Invested annuity'].values + feesPrefinancing.loc[4:, 'Fees'].values + feesMobiDeferred.loc[4:, 'Fees'].values + feesLTQDeferred.loc[4:, 'Fees'].values)
解决方法
1. 显式转换赋值结果为float64
直接对计算后的numpy数组转换 dtype,确保和目标列完全匹配:
df1.loc[4:7, 'AuM'] = (feesPrefinancing.loc[:3, 'Fees'] + feesMobiDeferred.loc[:3, 'Fees'] + feesLTQDeferred.loc[:3, 'Fees']).values.astype('float64') df1.loc[8:, 'AuM'] = (annuities['Invested annuity'].values + feesPrefinancing.loc[4:, 'Fees'].values + feesMobiDeferred.loc[4:, 'Fees'].values + feesLTQDeferred.loc[4:, 'Fees'].values).astype('float64')
2. 避免使用.values,直接赋值Pandas Series
放弃转换为numpy数组,直接用Pandas Series赋值,Pandas会自动处理类型对齐逻辑:
df1.loc[4:7, 'AuM'] = feesPrefinancing.loc[:3, 'Fees'] + feesMobiDeferred.loc[:3, 'Fees'] + feesLTQDeferred.loc[:3, 'Fees'] df1.loc[8:, 'AuM'] = annuities['Invested annuity'] + feesPrefinancing.loc[4:, 'Fees'] + feesMobiDeferred.loc[4:, 'Fees'] + feesLTQDeferred.loc[4:, 'Fees']
3. 提前统一参与计算列的dtype
从源头确保所有用于计算的列都是float64类型,消除类型差异的可能性:
# 统一所有计算列的dtype feesPrefinancing['Fees'] = feesPrefinancing['Fees'].astype('float64') feesMobiDeferred['Fees'] = feesMobiDeferred['Fees'].astype('float64') feesLTQDeferred['Fees'] = feesLTQDeferred['Fees'].astype('float64') annuities['Invested annuity'] = annuities['Invested annuity'].astype('float64') # 再执行赋值操作 df1.loc[4:7, 'AuM'] = (feesPrefinancing.loc[:3, 'Fees'] + feesMobiDeferred.loc[:3, 'Fees'] + feesLTQDeferred.loc[:3, 'Fees']).values df1.loc[8:, 'AuM'] = (annuities['Invested annuity'].values + feesPrefinancing.loc[4:, 'Fees'].values + feesMobiDeferred.loc[4:, 'Fees'].values + feesLTQDeferred.loc[4:, 'Fees'].values)
问题原因
尽管AuM列初始化为float64,但计算后的结果可能是其他浮点类型(如float32),或者numpy数组的dtype与Pandas列的dtype存在隐式差异。Pandas新版本要求显式处理这种类型不一致,避免未来出现硬性类型错误。
内容的提问来源于stack exchange,提问作者A.Patrick

