通过 Pandas GroupBy 在 Class 的特征中可视化 NaN 值

Visualize NaN-Values in Features of a Class via Pandas GroupBy

善意的事业和帮助社区我解决了我在工作中遇到的第一个问题,你可以在这里看到:

在我使用它之后,我想可视化特征中 classes 和 nan-Values 的分布。因此,我将其绘制在条形图中。加上一些 classes 就非常方便了。

问题是,我有大约 120 个不同的 classes,总共有 50000 个数据对象 - 这些数据无法读取图表。

因此我想拆分可视化。

对于每个 class 应该有一个子图显示每个特征的 nan 值的总和。

数据:

CLASS FEATURE1 FEATURE2 FEATURE3
  X      1        1        2
  B      0        0        0
  C      2        3        1

实际剧情:

预期地块:

到目前为止,我的方法都没有奏效。

  1. 我试图通过 df.groupBy('Class').plot(kind="barh", subplots=True) 解决它 - 完全破坏布局并根据功能而不是 class 绘制。
  2. 我试过 但如果我将 groupBy-df 写入变量 'grouped' 我可以以完美的格式打印它并包含所有信息,但我无法以它的方式访问它在解决方案中完成。我总是收到错误消息:'string indices must be integers'

我的做法:

grouped = df.groupby('Class') 
for name, group in grouped: 
    group.plot.bar()

编辑 - 更多信息

我使用的数据是完全分类的——没有数值——我想在我的数据集的 classes(标签)的不同特征中显示 nan 值的数量。

使用seaborn

的解决方案
import seaborn as sns
ndf = pd.melt(df, id_vars="CLASS", var_name="feature", value_name="val")
sns.catplot("feature", "val", col="CLASS", data=ndf, kind="bar", col_wrap=1)
plt.show()

分组是要走的路,只需设置标签

for name, grp in df3.groupby('CLASS'):
    ax = grp.plot.bar()
    ax.set_xticks([])
    ax.set_xlabel(name)

通过@meW 提供的解决方案,我能够实现接近我的目标的结果。

我必须执行两个步骤才能实际使用他的解决方案。

  1. 通过 df = pd.DataFrame(df.groupBy('Class').count().rsub(df.groupby('Class').size(), axis =0)
  2. 将 GroupBy 对象转换为 DataFrame 对象
  3. 通过 groupby 查询,Class-Column 被转换为索引,所以我不得不通过 grouped['class'] = grouped.index
  4. 将其转换回来

此解决方案引发的两个问题:是否可以将刻度线与不同数量的 nan 相匹配。因为 类 在特征中只有 5-10 个 nan 值,而 类 具有超过 1000 个 nan 值。 (见图片)

第二个问题 - 特征名称仅显示在最后一个图中 - 有没有办法将它们添加到所有图的所有 x 轴