循环遍历数据框中的列以按类别生成直方图
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语言使用gganimate包可视化动画点直方图生成过程(dot histogram)在数据遍历的过程中逐步在箱体内堆叠数据点形成最终的点直方图