You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:45:34