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

按二元列outcome分组的pet频率柱状图绘制求助

没问题!针对你在Habitat数据集里遇到的分组频率柱状图问题,我给你几个靠谱的解决方案,应该能搞定那个counts长度不一致的报错:

方法1:用Seaborn的countplot(最省心)

Seaborn的countplot可以直接帮你处理分组统计,自动计算每个类别组合的频数,还能轻松应对pet里的Null值。直接上代码:

import seaborn as sns
import matplotlib.pyplot as plt

# 假设你的数据集已经加载到df里了
# df = pd.read_csv("habitat.csv")

# 绘制分组柱状图,hue参数指定按outcome分组
sns.countplot(data=df, x="pet", hue="outcome")

# 添加上清晰的标签和标题
plt.xlabel("Pet (Y/N/Null)")
plt.ylabel("Frequency")
plt.title("Grouped Frequency of Pet by Outcome")
plt.legend(title="Outcome")

plt.show()

如果Null值没显示出来,你可以先把它转成一个明确的类别,比如:

df['pet'] = df['pet'].fillna('Missing')

再运行上面的绘图代码就行,这样Null会被当成一个独立的类别统计。

方法2:用Pandas的crosstab配合柱状图

先通过交叉表明确统计出每个组合的频数,再绘图,这样能直观看到统计结果,方便排查问题:

import pandas as pd
import matplotlib.pyplot as plt

# 交叉统计pet和outcome的频数,dropna=False保留Null值
cross_counts = pd.crosstab(df['pet'], df['outcome'], dropna=False)

# 直接绘制分组柱状图
cross_counts.plot(kind='bar')

plt.xlabel("Pet (Y/N/Null)")
plt.ylabel("Frequency")
plt.title("Grouped Frequency of Pet by Outcome")
plt.legend(title="Outcome")

plt.show()

这里的dropna=False是关键,它会把pet里的Null作为一个有效类别保留下来,确保统计的行和outcome的列数量完全匹配,从根源避免counts长度不一致的问题。

方法3:手动计算counts(修复你原代码的问题)

如果之前你是手动计算counts出错,大概率是没考虑Null值或者遗漏了某些类别组合。可以试试这样手动统计:

import matplotlib.pyplot as plt
import numpy as np

# 把pet转成字符串,让Null变成"nan"作为明确类别
pet_cats = df['pet'].astype(str).unique()
outcome_cats = df['outcome'].unique()

# 初始化列表存储每个pet类别对应的outcome频数
counts = []
for pet in pet_cats:
    pet_outcome_counts = []
    for oc in outcome_cats:
        # 统计当前pet和outcome组合的数量
        mask = (df['pet'].astype(str) == pet) & (df['outcome'] == oc)
        pet_outcome_counts.append(df[mask].shape[0])
    counts.append(pet_outcome_counts)

# 设置柱状图的宽度和位置
bar_width = 0.35
r1 = np.arange(len(pet_cats))
r2 = [x + bar_width for x in r1]

# 绘制两组柱状图
plt.bar(r1, counts[0], width=bar_width, label=outcome_cats[0])
plt.bar(r2, counts[1], width=bar_width, label=outcome_cats[1])

# 调整标签和刻度
plt.xlabel("Pet (Y/N/Null)")
plt.xticks([r + bar_width/2 for r in r1], pet_cats)
plt.ylabel("Frequency")
plt.title("Grouped Frequency of Pet by Outcome")
plt.legend(title="Outcome")

plt.show()

这个方法把所有可能的类别组合都覆盖到了,每个pet类别对应的outcome频数列表长度都是一致的,自然就不会出现counts长度不匹配的报错了。

内容的提问来源于stack exchange,提问作者souravsarkar59

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:14