循环遍历数据框中的列以按类别生成直方图

Posted

技术标签:

【中文标题】循环遍历数据框中的列以按类别生成直方图【英文标题】:Loop over columns in a dataframe to produce histograms by category 【发布时间】:2020-06-10 18:46:02 【问题描述】:

我想根据结果变量(目标列)调查我的 df 中所有特征(列)的频率分布。搜索解决方案后,我发现了来自here 的漂亮 sn-p,它循环特征并为来自 Scikit-learn 的癌症数据集中的特征生成直方图。

import numpy as np
import matplotlib.pyplot as plt 
# from matplotlib.pyplot import matplotlib
fig,axes =plt.subplots(10,3, figsize=(12, 9)) # 3 columns each containing 10 figures, total 30 features
malignant=cancer.data[cancer.target==0] # define malignant
benign=cancer.data[cancer.target==1] # define benign
ax=axes.ravel()# flat axes with numpy ravel
for i in range(30):
  _,bins=np.histogram(cancer.data[:,i],bins=40)
  ax[i].hist(malignant[:,i],bins=bins,color='r',alpha=.5)
  ax[i].hist(benign[:,i],bins=bins,color='g',alpha=0.3)
  ax[i].set_title(cancer.feature_names[i],fontsize=9)
  ax[i].axes.get_xaxis().set_visible(False) # the x-axis co-ordinates are not so useful, as we just want to look how well separated the histograms are
  ax[i].set_yticks(())
ax[0].legend(['malignant','benign'],loc='best',fontsize=8)
plt.tight_layout()# let's make good plots
plt.show() 

假设我的 df 具有跨连续列组织的所有特征和目标变量,我将如何遍历我的列以重现直方图。我考虑过的一种解决方案是groupby 方法。

df.groupby("class").col01.plot(kind='kde', ax=axs[1]) 

非常感谢任何想法!

【问题讨论】:

包含的解决方案有什么问题? 我无法为不同的类别分配自定义颜色。是否可以调整循环 sn-p 使其适用于我的 df 结构? 【参考方案1】:

其实你可以用sns.FacetGrid这个:

# Random data:
np.random.seed(1)
df = pd.DataFrame(np.random.uniform(0,1,(100,6)), columns=list('ABCDEF'))
df['class'] = np.random.choice([0,1], p=[0.3,0.7], size=len(df))

# plot
g = sns.FacetGrid(df.melt(id_vars='class'), 
                  col='variable', 
                  hue='class',
                  col_wrap=3)                # change this to your liking
g = g.map(sns.kdeplot, "value", alpha=0.5)

输出:

【讨论】:

以上是关于循环遍历数据框中的列以按类别生成直方图的主要内容,如果未能解决你的问题,请参考以下文章

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

在R中为一个工作表制作多个类别的单独直方图

如何从多索引中提取总年份行和列以在绘图中创建直方图

R语言使用gganimate包可视化动画点直方图生成过程(dot histogram)在数据遍历的过程中逐步在箱体内堆叠数据点形成最终的点直方图

循环遍历列以获取基于标题的列号

遍历 pandas 数据框中的所有列以在分隔符上拆分