如何用Pandas绘制指定列饼图?含缺失值的两种场景实现
问题描述
我有一个包含多列的DataFrame df,其中df["house_electricity"]列包含1、0、空值/NA三种取值。需要绘制两种饼图:
- 第一种仅展示1和0的占比;
- 第二种展示1、0及空值/NA的全部占比。
尝试了如下代码但未得到预期结果,附示例数据及尝试代码:
示例数据
| customer_id | house_electricity | house_refrigerator |
|---|---|---|
| cid01 | 0 | 0 |
| cid02 | 1 | na |
| cid03 | 1 | |
| cid04 | 1 | |
| cid05 | na | 0 |
尝试的代码
# 我写了以下代码但未得到预期结果 import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("my_file.csv") df_col = df.columns df["house_electricity"].plot(kind="pie")
解决方案
你之前的代码问题在于直接对整列画饼图,pandas会把每一行的数值当成独立切片,而非统计不同取值的占比。需要先预处理数据、统计频次,再绘制饼图:
1. 正确读取并预处理数据
首先要把CSV里的文本型na和空字符串统一转为pandas可识别的NaN,否则空值统计会出错:
import pandas as pd import matplotlib.pyplot as plt # 读取CSV,将"na"和空字符串转为NaN df = pd.read_csv("my_file.csv", na_values=["na", ""])
2. 绘制仅包含1和0的饼图
先过滤空值,再统计1和0的出现频次:
# 过滤空值,只保留1和0的数据 filtered_data = df["house_electricity"].dropna() # 统计1和0的频次 counts_0_1 = filtered_data.value_counts() # 绘制饼图 plt.figure(figsize=(6,6)) counts_0_1.plot(kind="pie", autopct="%.1f%%", labels=["1", "0"], title="仅1和0的占比") plt.ylabel("") # 去掉默认y轴标签,让图表更简洁 plt.show()
3. 绘制包含1、0及空值的饼图
用value_counts(dropna=False)可以把空值纳入统计:
# 统计所有取值(包含空值)的频次 counts_all = df["house_electricity"].value_counts(dropna=False) # 给空值重命名为更清晰的标签 counts_all = counts_all.rename({pd.NA: "空值/NA"}) # 绘制饼图 plt.figure(figsize=(6,6)) counts_all.plot(kind="pie", autopct="%.1f%%", title="1、0及空值的全部占比") plt.ylabel("") plt.show()
内容的提问来源于stack exchange,提问作者Sur
相关产品推荐
相关产品推荐

