如何一次性将 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 列值映射到十六进制颜色? 的相关文章

随机推荐

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

    我的疑问是 如果我输入填充数组的密码 程序就可以正常工作 但是 如果我输入诸如 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