无法向新DataFrame列添加已有数据?附箱线图实现需求
问题解决:性别薪资数据提取与并列箱线图实现
一、薪资列赋值NaN问题的解决
你的代码中Female Salaries列始终为NaN的核心原因是索引不匹配:
- 筛选出的
df_male和df_female保留了原数据集的索引,将df_male["Salary"]赋值给df2后,df2的索引是df_male的原索引(如3、7、10等);而df_female的索引是另一组值(如0、1、2等),两者无重叠,因此赋值后对应位置全为NaN。 - 另外你筛选男性时的条件
df.Gender == "M "多了一个空格,从数据集预览看,Gender列的男性值是"M"而非"M ",这会导致筛选结果不准确。
修正后的代码
# 导入库 import matplotlib.pyplot as plt import pandas as pd # 读取数据 df = pd.read_csv("TMA_Data.csv") # 修正筛选条件,去掉多余空格,并重置索引(drop=True避免保留原索引列) df_female = df[df["Gender"] == "F"].reset_index(drop=True) df_male = df[df["Gender"] == "M"].reset_index(drop=True) # 创建新DataFrame并赋值 df2 = pd.DataFrame({ "Male Salaries": df_male["Salary"], "Female Salaries": df_female["Salary"] }) # 查看结果 print(df2.head())
或者更简单的方式,直接提取薪资数组赋值,忽略索引:
df2 = pd.DataFrame() df2["Male Salaries"] = df[df["Gender"] == "M"]["Salary"].values df2["Female Salaries"] = df[df["Gender"] == "F"]["Salary"].values
这样就能保证两列索引对齐,不会出现NaN。
二、并列箱线图的更优实现方案
无需单独创建新DataFrame,直接通过原数据分组即可快速绘制并列箱线图,以下是两种常用方式:
方式1:使用Pandas内置的boxplot方法
Pandas的DataFrame可直接按Gender分组绘制箱线图,代码更简洁:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("TMA_Data.csv") # 按Gender分组绘制薪资箱线图 df.boxplot(column="Salary", by="Gender", patch_artist=True) plt.title("性别薪资差距箱线图") plt.suptitle("") # 去掉默认自动生成的标题 plt.xlabel("性别") plt.ylabel("薪资") plt.show()
方式2:使用Matplotlib手动绘制并列箱线图
如果需要自定义样式,可以手动提取两组薪资数据传入matplotlib:
import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("TMA_Data.csv") # 提取男女薪资数据 male_salaries = df[df["Gender"] == "M"]["Salary"].values female_salaries = df[df["Gender"] == "F"]["Salary"].values # 绘制并列箱线图 fig, ax = plt.subplots() box = ax.boxplot([male_salaries, female_salaries], patch_artist=True) # 设置样式和标签 ax.set_xticklabels(["男性", "女性"]) ax.set_xlabel("性别") ax.set_ylabel("薪资") ax.set_title("性别薪资差距箱线图") # 给箱线图填充颜色 colors = ["#1f77b4", "#ff7f0e"] for patch, color in zip(box['boxes'], colors): patch.set_facecolor(color) plt.show()
内容的提问来源于stack exchange,提问作者codes
相关产品推荐
相关产品推荐

