如何一次性将 df 列值映射到十六进制颜色?

2023-12-12

我有一个包含两列的 pandas 数据框。其中一列值需要映射到十六进制颜色。另一个绘图过程从那里接管。

这是我到目前为止所尝试过的。部分玩具代码取自here.

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

import seaborn as sns

# Create dataframe
df = pd.DataFrame(np.random.randint(0,21,size=(7, 2)), columns=['some_value', 'another_value'])
# Add a nan to handle realworld
df.iloc[-1] = np.nan 

# Try to map values to colors in hex
# # Taken from here 
norm = matplotlib.colors.Normalize(vmin=0, vmax=21, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)

df['some_value_color'] = df['some_value'].apply(lambda x: mapper.to_rgba(x))
df

哪个输出:

enter image description here

我如何转换'some_value'df 列值一次性转换为十六进制? 理想情况下使用sns.cubehelix_palette(light=1)

我不反对使用除matplotlib

提前致谢。


您可以使用matplotlib.colors.to_hex()将颜色转换为十六进制表示形式。

import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

import seaborn as sns

# Create dataframe
df = pd.DataFrame(np.random.randint(0,21,size=(7, 2)), columns=['some_value', 'another_value'])
# Add a nan to handle realworld
df.iloc[-1] = np.nan 

# Try to map values to colors in hex
# # Taken from here 
norm = matplotlib.colors.Normalize(vmin=0, vmax=21, clip=True)
mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)

df['some_value_color'] = df['some_value'].apply(lambda x: mcolors.to_hex(mapper.to_rgba(x)))
df

enter image description here


效率

上面的方法使用起来很方便,但是效率可能不是很高。下面让我们比较一些替代方案。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

def create_df(n=10):
    # Create dataframe
    df = pd.DataFrame(np.random.randint(0,21,size=(n, 2)), 
                      columns=['some_value', 'another_value'])
    # Add a nan to handle realworld
    df.iloc[-1] = np.nan
    return df

下面是上面的解决方案。它将转换逐行应用于数据帧。这相当低效。

def apply1(df):
    # map values to colors in hex via
    # matplotlib to_hex by pandas apply
    norm = mcolors.Normalize(vmin=np.nanmin(df['some_value'].values), 
                                       vmax=np.nanmax(df['some_value'].values), clip=True)
    mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)

    df['some_value_color'] = df['some_value'].apply(lambda x: mcolors.to_hex(mapper.to_rgba(x)))
    return df

这就是为什么我们可能选择首先将值计算到 numpy 数组中,然后将该数组分配为新创建的列。

def apply2(df):
    # map values to colors in hex via
    # matplotlib to_hex by assigning numpy array as column
    norm = mcolors.Normalize(vmin=np.nanmin(df['some_value'].values), 
                                       vmax=np.nanmax(df['some_value'].values), clip=True)
    mapper = plt.cm.ScalarMappable(norm=norm, cmap=plt.cm.viridis)
    a = mapper.to_rgba(df['some_value'])
    df['some_value_color'] =  np.apply_along_axis(mcolors.to_hex, 1, a)
    return df

最后,我们可以使用从 matplotlib 颜色图创建的查找表 (LUT),并通过标准化数据对 LUT 进行索引。由于此解决方案需要首先创建 LUT,因此对于条目数少于 LUT 颜色的数据帧来说效率相当低,但对于大型数据帧来说效果很好。

def apply3(df):
    # map values to colors in hex via
    # creating a hex Look up table table and apply the normalized data to it
    norm = mcolors.Normalize(vmin=np.nanmin(df['some_value'].values), 
                                       vmax=np.nanmax(df['some_value'].values), clip=True)
    lut = plt.cm.viridis(np.linspace(0,1,256))
    lut = np.apply_along_axis(mcolors.to_hex, 1, lut)
    a = (norm(df['some_value'].values)*255).astype(np.int16)
    df['some_value_color'] = lut[a]
    return df

比较时间让我们采用一个包含 10000 行的数据框。df = create_df(10000)

  • 原始解决方案(应用1)

    %timeit apply1(df)
    2.66 s per loop
    
  • 数组解决方案(应用2)

    %timeit apply2(df)
    240 ms per loop
    
  • LUT解决方案(应用3)

    %timeit apply1(df)
    7.64 ms per loop
    

在这种情况下,LUT 解决方案几乎提供了 400 倍的改进。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何一次性将 df 列值映射到十六进制颜色? 的相关文章

  • 如何从文件中读取两行并在 for 循环中创建动态键,后续

    这个问题紧接着所讨论的问题 如何从文件中读取两行并在 for 循环中创建动态键 https stackoverflow com q 41929351 868546 但是 问题的本质已经发展到我想要解决的某种复杂性 下面是我的数据结构 用空格
  • Matplotlib xlabel Arial 格式,其中一个单词为斜体

    我想创建一个 matplotlib 图形 其 x 轴标签采用 Arial 字体 并且有一个斜体字 我可以用乳胶字体创建带有 x 轴标签的图形 其中一个单词为斜体 我还可以在 Arial 中创建带有 x 轴标签的图形 只要我将整个标签设置为斜
  • 找到不固定长度的数字的所有可能排列以达到给定的总和或乘积

    使用普通 Python 或任何 Python 库 您将如何查找列表中元素的所有可能组合l等于给定值val using addition 减法 or 乘法 假设列表的长度并不总是相同 假设列表中的每个元素在每个组合中只能使用一次 并假设没有使
  • 如何褪色

    我想将像素的颜色淡化为白色 但显然保持相同的颜色 如果我有一个像素 200 120 40 将每个值加上 10 以使 210 130 50 使其颜色相同 只是颜色更浅 还是会完全改变颜色 例如 我知道 100 100 100 即将 110 1
  • 将箱线图添加到Python中的其他图表中

    这两个图的每个点的 x 轴值完全相同 是否可以在第一个图的顶部显示盒须 我试过这个 fig1 plt figure ax fig1 add subplot 211 ax set xscale log ax plot x7 y7 c ax p
  • 如何创建在特定范围内开始和结束的条形图

    我创建了一个计算机模型 只是为了好玩 来预测足球比赛结果 我进行了计算机模拟来预测一支球队将获得多少分 我得到了每个团队的模拟结果列表 我想绘制诸如置信区间之类的东西 但使用条形图 我考虑了以下选择 我考虑过使用 matplotlib 的烛
  • Python Pandas 滚动聚合一列列表

    我有一个简单的数据框 df 和一列列表lists 我想根据以下内容生成一个附加列lists The df好像 import pandas as pd lists 1 1 2 1 2 3 3 2 9 7 9 4 2 7 3 5 create
  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • 加载pickle时出错

    无法加载 pickle 文件 我正在使用 python 3 5 import pickle data pickle load open D ud120 projects final project final project dataset
  • 无限实时连续传输音频信号,Python

    我有一个简单的问题 在 Python 中从音频插孔流式传输音频信号时 使用 pyaudio 库如何继续流式传输音频信号 直到我选择 停止 程序 示例 我们的方式捕捉我们的网络摄像头 https docs opencv org 3 0 bet
  • 在html表格的每一行添加点击功能

    我最近创建了一个函数 它根据用户在网站中的输入进行一些复杂的名称匹配 并将结果作为表格格式的 html 文件返回 我的问题是如何在每一行添加点击功能 df get cust info returns a pandas dataframe d
  • 如何替换 Pandas Dataframe 中不在列表中的所有值? [复制]

    这个问题在这里已经有答案了 我有一个值列表 如何替换 Dataframe 列中不在给定值列表中的所有值 例如 gt gt gt df pd DataFrame D ND D garbage columns S gt gt gt df S 0
  • 如何计算 pandas datetime 对象的均值和方差?

    如何计算 YYYY MM DD 形式的 python 日期时间对象的汇总统计数据 均值和标准差 我想对具有不同 ID 的不同日期时间对象组执行此操作 数据如下 import datetime as dt df pd DataFrame Da
  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • 如何在 Matplotlib 饼图周围绘制箭头以将每个标签指向圆圈中各自的部分?

    我一直在用 Matplotlib 绘制一些图表 我有一个饼图 想要在图表周围绘制箭头 使每个标签都指向图表 我有一个例子 这是我当前的代码 import matplotlib pyplot as plt plt rcParams font
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv

随机推荐

  • 输入用户的密码并检查密码是否包含字符、字母和数字

    我的疑问是 如果我输入填充数组的密码 程序就可以正常工作 但是 如果我输入诸如 apple25 之类的密码 我认为它将数组中的空格计为字符 甚至将 apple25 声明为有效密码 我该如何防止这种情况发生 是否也将字符串终止符算作char
  • 是否可以在Powershell中将字节数组转换为8位有符号整数数组?

    我正在尝试在 Powershell 中将十六进制字符串转换为 8 位有符号整数数组 我使用以下函数将十六进制字符串 例如 A591BF86E5D7D9837EE7ACC569C4B59B 转换为字节数组 然后需要将其转换为 8 位有符号整数
  • 无法连接到 http://localhost:8091/index.html

    我刚刚在我的 Windows 7 64 位计算机上使用 setup exe 安装了 CouchBase Server Enterprise v2 0 0 据说基于浏览器的控制台应该在安装后自动出现 但我得到的是 无法连接 Firefox c
  • 在Python中使用Selenium点击所有具有相同类名的元素

    我正在尝试单击网页上的所有 喜欢 按钮 我知道如何单击其中一个 但我希望能够单击全部 它们具有相同的类名 但不同的 id 我是否需要创建某种列表并告诉它单击列表中的每一项 有没有办法写 点击全部 这是我的代码的样子 我删除了登录代码 fro
  • 自动开启GPS

    我用谷歌搜索了一下 有一些关于利用电源管理器错误来解决这个问题的解决方案 但由于该错误现已解决 那么现在如何解决应用程序启动时启动 GPS 的问题呢 请帮忙 使用此功能 private void turnGPSOn String provi
  • 释放二维数组中的内存

    假设我们有 int myArray new int 100 for int i 0 i lt 100 i myArray i new int 3 解除分配该数组的适当方法是什么 如果是正确的方法 则使用下面的方法 1 delete myAr
  • " [关闭]' aria-label='在一个 .php 中使用 header('Content-type: image/png') 和 echo"" [关闭]'> 在一个 .php 中使用 header('Content-type: image/png') 和 echo"" [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我想用imagecreatefromjpeg imagecreatetruecolor imagecopyresized and imagejpeg同时利用echo etc 由于某种原
  • 在Android Studio中创建多个项目

    我想做的事 在android studio中创建三个android项目1 公共项目或库项目 这是一个独立的项目 2 使用库项目的Project13 使用库项目的Project2 问题是什么 在 eclipse 中很容易实现 但在 andro
  • 为什么数组在javascript中不按递增日期或递减日期排序?

    我正在尝试对我的对象数组进行排序 对象具有日期属性 我需要按升序或降序日期对我的数组进行排序 我尝试这样 https jsfiddle net rxaLutgn 1 function sort by field reverse primer
  • Java 9 子包跨模块拆分

    在 Java 9 中 我可以跨模块拆分子包吗 例如 我可以有com example foo在一个模块中并且com example foo bar在另一个模块中 这似乎是一个简单的问题 但由于某种原因 我在搜索后无法找到直接答案 如有权威参考
  • 有哪些工具和语言可用于 Windows shell 脚本编写?

    我想知道在 Windows 平台上执行一些脚本工作的选项有哪些 我需要文件操作 注册表编辑等功能 可以使用脚本工具编辑文件吗 Windows 脚本工具还提供哪些其他功能 使用 Windows GUI 可以完成的所有操作都可以使用脚本语言完成
  • 使用 ScheduleJobs 调用计划

    我一直在试图弄清楚如何在 Quartz Net 中调用 ScheduleJobs 方法 但努力创建它所期望的正确参数 这是我尝试过的 IJobDetail jobDetail JobBuilder Create
  • UILabel 中的文本可以分配有 colorWithPatternImage: 吗?

    如果是这样 图像可以动画化吗 有充分的理由不这样做吗 内存使用情况等 是的 标签可以有图案颜色 替代文本 http img178 imageshack us img178 1995 textwithpatterncolor png make
  • 没有名为tensorflow.python.platform的模块

    我在跑步tensorflow g3doc tutorials mnist fully connected feed py I get hiro106 hiro106 virtual machine python tensorflow ten
  • 无法通过 Watir 连接到 Tor-Firefox

    我在通过 Ruby Watir webdriver 连接到 Tor 时遇到问题 我使用 Tor 浏览器捆绑包 问题是 当我尝试通过 Watir Selenium 连接时 我似乎无法打开 Tor 而不是常规的 Firefox 看着类似的问题
  • 两个 Android 应用和一个 Firebase 数据库

    我需要为两个 Android 应用程序使用一个 Firebase 数据库 一个应用程序将具有对数据库的写访问权限 另一个应用程序将具有对数据库的读访问权限 这两个应用程序必须分开 我无法合并它们 我可以为两个应用使用一个 Firebase
  • 如何检测 UI 和游戏对象上的点击/触摸事件

    如何在android中检测Canvas on Touch上的UI对象 例如 我有一个画布 其中有 5 个对象 例如Image RawImage Buttons InputField等等 当我触摸 Button UI 对象时然后执行某些操作
  • 根据对象属性值在 Cloudant (CouchDB) 中创建视图

    我一直在尝试找到满足此要求的解决方案 但遇到了很多死胡同 我在用着Cloudant作为我的用户文档的数据存储 每个用户文档都有一个名为 items 的字段 属性 它是一个对象数组 所以用户文档看起来像这样 id userid1 rev XX
  • 在 Swift 中创建 PDF

    我正在关注苹果的文档在 Swift 中使用 Xcode6 Beta6 创建 PDF 文件 var currentText CFAttributedStringRef CFAttributedStringCreate nil textView
  • 如何一次性将 df 列值映射到十六进制颜色?

    我有一个包含两列的 pandas 数据框 其中一列值需要映射到十六进制颜色 另一个绘图过程从那里接管 这是我到目前为止所尝试过的 部分玩具代码取自here import pandas as pd import matplotlib impo