Pandas交叉表百分比列显示NaN的问题排查与修复
RFM交叉表百分比列全NaN且触发RuntimeWarning问题解决
问题背景
将DataFrame拆分训练集后生成RFM列,使用pd.crosstab制作交叉表时,新增Percentage列计算百分比,结果该列全为NaN,同时出现RuntimeWarning报错。
我的代码
trainData, validData = train_test_split(df, test_size=0.4, random_state=1) trainData['RFM'] = trainData['Mcode'].astype(str) + trainData['Rcode'].astype(str) + trainData['Fcode'].astype(str) rfm_crosstab = pd.crosstab(index=[trainData['RFM']], columns=trainData['Florence'], margins=True) rfm_crosstab['Percentage'] = trainData.Florence[1] / (trainData.Florence[1] + trainData.Florence[0]) rfm_crosstab
运行结果
Florence 0 1 All Percentage RFM 111 3 0 3 NaN 121 3 2 5 NaN 131 9 1 10 NaN 141 14 0 14 NaN 211 3 0 3 NaN 212 1 2 3 NaN 221 6 3 9 NaN 222 6 1 7 NaN 231 20 2 22 NaN 232 22 1 23 NaN 241 24 2 26 NaN 242 18 1 19 NaN 311 9 0 9 NaN 312 6 0 6 NaN 313 2 1 3 NaN 321 17 3 20 NaN 322 20 4 24 NaN 323 2 1 3 NaN 331 35 1 36 NaN 332 30 2 32 NaN 333 19 0 19 NaN 341 61 10 71 NaN 342 58 2 60 NaN 343 17 2 19 NaN 411 12 3 15 NaN 412 19 1 20 NaN 413 15 1 16 NaN 421 29 0 29 NaN 422 26 5 31 NaN 423 32 8 40 NaN 431 75 6 81 NaN 432 68 3 71 NaN 433 71 5 76 NaN 441 96 12 108 NaN 442 109 6 115 NaN 443 103 10 113 NaN 511 19 4 23 NaN 512 23 2 25 NaN 513 44 8 52 NaN 521 24 5 29 NaN 522 44 2 46 NaN 523 74 16 90 NaN 531 110 4 114 NaN 532 102 4 106 NaN 533 177 28 205 NaN 541 107 6 113 NaN 542 122 11 133 NaN 543 282 21 303 NaN All 2188 212 2400 NaN
报错信息
/var/folders/wv/42dn23fd1cb0czpvqdnb6zw00000gn/T/ipykernel_655/3261767759.py:4:
RuntimeWarning: invalid value encountered in long_scalars
rfm_crosstab['Percentage'] = trainData.Florence[1] /
(trainData.Florence[1] + trainData.Florence[0])
样本数据
Seq# ID# Gender M R F FirstPurch ChildBks YouthBks CookBks ... ItalCook ItalAtlas ItalArt Florence Related Purchase Mcode Rcode Fcode Yes_Florence No_Florence 0 1 25 1 297 14 2 22 0 1 1 ... 0 0 0 0 0 5 4 2 0 1 1 2 29 0 128 8 2 10 0 0 0 ... 0 0 0 0 0 4 3 2 0 1 2 3 46 1 138 22 7 56 2 1 2 ... 1 0 0 0 2 4 4 3 0 1 3 4 47 1 228 2 1 2 0 0 0 ... 0 0 0 0 0 5 1 1 0 1 4 5 51 1 257 10 1 10 0 0 0 ... 0 0 0 0 0 5 3 1 0 1
问题原因
trainData.Florence[1]是取索引为1的行的Florence值,并非统计整个列中值为1的数量。用单个值做除法得到的是一个标量,赋值给交叉表列时因索引不匹配,导致所有行显示NaN;若索引1对应的Florence值为0,还会触发除以0的警告。
解决方法
直接基于交叉表已统计好的分组数据计算百分比,比如计算每个RFM分组中Florence=1的占比:
# 计算Florence=1的占比,保留4位小数 rfm_crosstab['Percentage'] = (rfm_crosstab[1] / rfm_crosstab['All']).round(4)
如果需要计算Florence=0的占比,替换为rfm_crosstab[0] / rfm_crosstab['All']即可。这样计算的结果会和交叉表的行一一对应,不会出现NaN,也不会触发警告。
内容的提问来源于stack exchange,提问作者c200402
相关产品推荐
相关产品推荐

