通过Pandas GroupBy可视化类特征中的值

2024-04-19 21:06:29 发布

您现在位置:Python中文网/ 问答频道 /正文

出于对社区的友好和帮助,我解决了我工作中遇到的第一个问题,你可以在这里看到:Basic Problem - necessary for understanding the upcoming

在我使用这个之后,我想可视化类的分布和特性中的nan值。所以我把它画成条形图。只要上几节课就很方便了。你知道吗

问题是,我有大约120个不同的类,总共有50000个数据对象-这些图不能用这么多的数据读取。你知道吗

因此,我想分割视觉效果。你知道吗

对于每个类,应该有一个子图显示每个特征的nan值之和。你知道吗

数据:

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

实际绘图:

Normal Plot

预期地块:

enter image description hereenter image description hereenter image description here

到目前为止,我的方法没有一个奏效。你知道吗

  1. 我试图通过df.groupBy('Class').plot(kind="barh", subplots=True)来解决这个问题—完全破坏了布局,并按功能而不是按类绘制。你知道吗
  2. 我试过this approach但是如果我把groupBy df写进变量'grouped'中,我可以用一种完美的格式打印所有的信息,但是我不能以解决方案中的方式访问它。我总是得到错误:“字符串索引必须是整数”

我的方法:

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

编辑-更多信息

我使用的数据是完全分类的-没有数值-我想在我的数据集的类(标签)的不同功能中显示nan值的数量。你知道吗


Tags: 数据方法功能信息dfforbasicplot
3条回答

使用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()

plt

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

我必须做两个步骤才能真正使用他的解决方案。你知道吗

  1. 通过df = pd.DataFrame(df.groupBy('Class').count().rsub(df.groupby('Class').size(), axis =0)将GroupBy对象强制转换为DataFrame对象
  2. 通过groupby查询,类列被转换为索引,因此我必须通过grouped['class'] = grouped.index将其转换回来

这个解决方案引发了两个问题:是否有可能使蜱虫适应不同数量的nan。因为在features中有只有5-10个nan值的类,也有超过1000个nan值的类。(见图)

Many NaNLess NaN

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

分组是方法,只需设置标签

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

相关问题 更多 >