创建箱线图时Python分类变量NaN及语法错误的解决咨询
问题解决步骤
一、搞定Memory列的NaN问题
你的RAM列数据格式不统一,有带空格的(比如'12 GB')、带GB后缀的(比如'6GB')、纯数字的(比如'6'),直接用pd.to_numeric转的话,带非数字字符的内容会被强制转成NaN,导致分箱后出现空值。按下面步骤处理:
- 先把RAM列里的数字提取出来,统一转成整数:
# 注意:样本里列名是'RAM',不是你代码里写的'RAM '(多了个空格),要对应实际列名 df['RAM_clean'] = df['RAM'].str.extract('(\d+)').astype(int)
这段正则会把所有数字字符抠出来,不管原来的格式是什么,都能得到纯数字的RAM值。
- 重新生成Memory分类列:
df['Memory'] = pd.cut(df['RAM_clean'], bins=[0,4,8,12], include_lowest=True, labels=['Basic', 'Intermediate', 'Advanced'])
(顺便提一句,你之前标签写的'Advaced'是拼写错误,改成'Advanced'更准确)
二、修复箱线图的语法错误
你不能把数据赋值的代码直接塞到sns.boxplot的data参数里,这属于语法错误,Python不允许这么写。正确做法是先把所有数据处理好,再调用绘图函数:
完整流程代码:
import pandas as pd import seaborn as sns # 1. 清理RAM列 df['RAM_clean'] = df['RAM'].str.extract('(\d+)').astype(int) # 2. 创建Memory分类列 df['Memory'] = pd.cut(df['RAM_clean'], bins=[0,4,8,12], include_lowest=True, labels=['Basic', 'Intermediate', 'Advanced']) # 3. 别忘了清理Price列!样本里Price带$符号和空格,得转成数值才能绘图 df['Price_clean'] = df['Price'].str.replace('$', '', regex=False).str.strip().astype(float) # 4. 绘制箱线图 sns.boxplot(x='Memory', y='Price_clean', data=df)
额外提醒
- 确认你的DataFrame列名:代码里的列名要和实际数据一致,你之前写的
RAM(带空格)和样本里的RAM(无空格)不一样,别因为这个踩坑。 - 如果还有NaN,检查RAM里有没有完全不含数字的行,这种情况需要单独处理(比如删除或填充)。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

