首页 > 编程问答 >每组具有归一化 y 轴的计数图

每组具有归一化 y 轴的计数图

时间:2024-08-01 07:53:08浏览次数:18  
标签:python pandas seaborn countplot

我想知道是否可以创建 Seaborn 计数图,但不是显示 y 轴上的实际计数,而是显示其组内的相对频率(百分比)(如 hue 参数指定)。

I使用以下方法解决了这个问题,但我无法想象这是最简单的方法:

# Plot percentage of occupation per income class
grouped = df.groupby(['income'], sort=False)
occupation_counts = grouped['occupation'].value_counts(normalize=True, sort=False)

occupation_data = [
    {'occupation': occupation, 'income': income, 'percentage': percentage*100} for 
    (income, occupation), percentage in dict(occupation_counts).items()
]

df_occupation = pd.DataFrame(occupation_data)

p = sns.barplot(x="occupation", y="percentage", hue="income", data=df_occupation)
_ = plt.setp(p.get_xticklabels(), rotation=90)  # Rotate labels

结果:

Percentage plot with seaborn

我正在使用 UCI 机器学习存储库中众所周知的成人数据集|| |。 pandas 数据框是这样创建的: 这个问题

# Read the adult dataset
df = pd.read_csv(
    "data/adult.data",
    engine='c',
    lineterminator='\n',

    names=['age', 'workclass', 'fnlwgt', 'education', 'education_num',
           'marital_status', 'occupation', 'relationship', 'race', 'sex',
           'capital_gain', 'capital_loss', 'hours_per_week',
           'native_country', 'income'],
    header=None,
    skipinitialspace=True,
    na_values="?"
)

有点相关,但没有使用 参数。就我而言,我不能只更改 y 轴上的标签,因为条形的高度必须取决于组。 hue parameter. And in my case I cannot just change the labels on the y-axis, because the height of the bar must depend on the group.


无需手动计算和准备百分比数据以在 Seaborn 中使用。Seaborn 的 countplot 函数中内置了一个更直接的解决方案,可以实现这一点。可以使用 estimator 参数结合 NumPy 的 mean 函数来完成此操作。由于每个条形表示“hue”类别中存在的总值的百分比,因此平均值在本质上计算了该特定“hue”级别的出现次数。

以下是使用的数据集实现此操作的方法:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 读取成人数据集
df = pd.read_csv(
    "data/adult.data",
    engine='c',
    lineterminator='\n',
    names=['age', 'workclass', 'fnlwgt', 'education', 'education_num',
           'marital_status', 'occupation', 'relationship', 'race', 'sex',
           'capital_gain', 'capital_loss', 'hours_per_week',
           'native_country', 'income'],
    header=None,
    skipinitialspace=True,
    na_values="?"
)

# 使用 countplot 并使用 estimator 作为百分比
p = sns.countplot(
    data=df,
    x="occupation", 
    hue="income",
    estimator=lambda x: len(x) / len(df) * 100
)
_ = plt.setp(p.get_xticklabels(), rotation=90)  # 旋转标签
plt.ylabel("Percentage") 
plt.show()

在本代码中:

  • 我们直接将原始数据框 df 传递给 sns.countplot
  • x 参数设置为“occupation”, hue 参数设置为“income”,这与的示例相同。
  • 技巧在于 estimator 参数。我们将其设置为一个 lambda 函数,该函数计算给定“hue”级别内每个职业的百分比。它计算特定“hue”级别中“occupation”计数( len(x) )与其在完整数据集中的总数( len(df) )的比率,然后乘以 100 以获得百分比。

这将在每个“income”组内提供归一化的计数,并有效地显示每个职业的相对频率,而无需手动预处理数据。

标签:python,pandas,seaborn,countplot
From: 34615854

相关文章

  • ffmpeg python 导致死锁
    我在使用ffmpegpython处理相机帧时遇到问题。我使用process.communicate()的第一种方法效果很好,但存在延迟问题。process=(ffmpeg.input('pipe:',format='rawvideo',pix_fmt='rgb24',s='{}x{}'.format(width,height))......
  • 将 HTTP 分块编码数据流代码片段从 Node.js 转换为 Python
    我有一个Node.js客户端代码,它将请求发送到HTTP服务器,然后连续接收分块编码数据。这是带有一些流量数据输出的Node.js代码。consthttp=require('http');constoptions={hostname:'...',path:'...',port:...,...};constreq=http.request(......
  • vsc python 调试器和 pylance 无法识别已安装的包
    我最近使用snowflake-connector-python在我的虚拟环境中安装了pipinstallsnowflake-connector-python[pandas]==2.7.6,当我在激活虚拟环境的情况下从命令行运行我的脚本时,它工作正常。我设置了与VSC解释器相同的虚拟环境,但尝试运行python调试器会引发异常......
  • 搜索查询后显示完整的 pandas
    我想实现以下非常小的项目,即用户应该输入产品名称,Python应该在数据库中搜索并在pyqt6桌面应用程序中显示查询结果,为此我已经实现了以下基本GUI形式:这里用户输入产品,然后单击按钮,结果将显示在空白处,即:QTextEdit(),最有趣的部分是这个功能:defreturn_product_......
  • 如何从python读取matlab持续时间对象
    我创建一个matlab持续时间对象并将其保存到.mat文件:timeend=seconds(123);save('time.mat',timeend,'-v7.3');然后我从python读取它:withh5py.File('time.mat','r')asf:var=f['timeend'][:]print(list(var))......
  • 通过 python 连接到 Snowflake 时出错“UnpicklingError: invalid load key, '\x00'
    我在使用snowflake.connector.connect通过python连接到snowflake时遇到以下错误importsnowflake.connector#pipinstallsnowflake-connector-python#iamgettingtheenvfrom.envfileistoredlocallycnx=snowflake.connector.connect(user=os.getenv('USER'),pass......
  • Pandas 合并重复行
    我有一个特定的用例,其中我有2个数据帧,它们有2个相同的行(除了1列)。相同的行,我需要与相同的行匹配,任何不匹配的行都需要垂直堆叠。这是场景df1=pd.Dataframe({'id':[0,1,2],'account':['a','b','c'],'details':[[{'a':......
  • Python Selenium 单击 webdriverwait 与 find_element
    我无法理解这两个代码块之间的区别。发送点击在webdriverwait和find_elements中都有效。代码1fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.suppo......
  • Python 问题 如何创建在 PDF 中注册为剪切线的专色?
    我正在开发一个项目,需要我在图像周围创建一条剪切线,但在任何RIP程序(例如Versaworks或Flexi)上将其注册为实际剪切线时遇到困难。我尝试了很多不同的方法python库可以帮助解决这个问题,但我无法让它工作。我希望它像我们在Illustrator中所做的那样,创建一条名为CutConto......
  • 有没有办法将 geopandas 函数应用于除了引发错误的行之外的所有行?
    我正在尝试将缓冲区应用于600,000行的地理数据帧(作为更大过程的一部分),gdf包含几何线串和多线串。当我运行缓冲区代码行时:gdf['buffer_geometry']=gdf.buffer(305)我收到以下错误:GEOSException:TopologyException:分配的深度在-122500003700000处不匹配我......