pd.get_dummies() 在大级别上缓慢

2023-12-08

我不确定这是否已经是最快的方法,或者我是否这样做效率低下。

我想对一个具有 27k+ 可能级别的特定分类列进行热编码。该列在 2 个不同的数据集中具有不同的值,因此我在使用 get_dummies() 之前首先组合了级别

def hot_encode_column_in_both_datasets(column_name,df,df2,sparse=True):
    col1b = set(df2[column_name].unique())
    col1a = set(df[column_name].unique())
    combined_cats = list(col1a.union(col1b))
    df[column_name] = df[column_name].astype('category', categories=combined_cats)
    df2[column_name] = df2[column_name].astype('category', categories=combined_cats)

    df = pd.get_dummies(df, columns=[column_name],sparse=sparse)
    df2 = pd.get_dummies(df2, columns=[column_name],sparse=sparse)
    try:
        del df[column_name]
        del df2[column_name]
    except:
        pass
    return df,df2

然而,它已经运行了2个多小时,但仍然卡在热编码上。

我可能在这里做错了什么吗?或者这只是在大型数据集上运行它的本质?

在对我想要的列进行热编码之前,Df 有 680 万行和 27 列,Df2 有 19990 行和 27 列。

感谢您的建议,谢谢! :)


我回顾了get_dummies 源代码简而言之,我认为它可能没有充分利用您的用例的稀疏性。下面的方法may更快,但我并没有尝试将其一直扩展到您拥有的 19M 记录:

import numpy as np
import pandas as pd
import scipy.sparse as ssp

np.random.seed(1)
N = 10000

dfa = pd.DataFrame.from_dict({
    'col1': np.random.randint(0, 27000, N)
    , 'col2b': np.random.choice([1, 2, 3], N)
    , 'target': np.random.choice([1, 2, 3], N)
    })

# construct an array of the unique values of the column to be encoded
vals = np.array(dfa.col1.unique())
# extract an array of values to be encoded from the dataframe
col1 = dfa.col1.values
# construct a sparse matrix of the appropriate size and an appropriate,
# memory-efficient dtype
spmtx = ssp.dok_matrix((N, len(vals)), dtype=np.uint8)
# do the encoding. NB: This is only vectorized in one of the two dimensions.
# Finding a way to vectorize the second dimension may yield a large speed up
for idx, val in enumerate(vals):
    spmtx[np.argwhere(col1 == val), idx] = 1

# Construct a SparseDataFrame from the sparse matrix and apply the index
# from the original dataframe and column names.
dfnew = pd.SparseDataFrame(spmtx, index=dfa.index,
                           columns=['col1_' + str(el) for el in vals])
dfnew.fillna(0, inplace=True)

UPDATE

借用其他答案的见解here and here,我能够在两个维度上对解决方案进行矢量化。在我有限的测试中,我注意到构建 SparseDataFrame 似乎将执行时间增加了几倍。因此,如果您不需要返回类似 DataFrame 的对象,则可以节省大量时间。该解决方案还可以处理需要将 2 个以上 DataFrame 编码为具有相同列数的二维数组的情况。

import numpy as np
import pandas as pd
import scipy.sparse as ssp

np.random.seed(1)
N1 = 10000
N2 = 100000

dfa = pd.DataFrame.from_dict({
    'col1': np.random.randint(0, 27000, N1)
    , 'col2a': np.random.choice([1, 2, 3], N1)
    , 'target': np.random.choice([1, 2, 3], N1)
    })

dfb = pd.DataFrame.from_dict({
    'col1': np.random.randint(0, 27000, N2)
    , 'col2b': np.random.choice(['foo', 'bar', 'baz'], N2)
    , 'target': np.random.choice([1, 2, 3], N2)
    })

# construct an array of the unique values of the column to be encoded
# taking the union of the values from both dataframes.
valsa = set(dfa.col1.unique())
valsb = set(dfb.col1.unique())
vals = np.array(list(valsa.union(valsb)), dtype=np.uint16)


def sparse_ohe(df, col, vals):
    """One-hot encoder using a sparse ndarray."""
    colaray = df[col].values
    # construct a sparse matrix of the appropriate size and an appropriate,
    # memory-efficient dtype
    spmtx = ssp.dok_matrix((df.shape[0], vals.shape[0]), dtype=np.uint8)
    # do the encoding
    spmtx[np.where(colaray.reshape(-1, 1) == vals.reshape(1, -1))] = 1

    # Construct a SparseDataFrame from the sparse matrix
    dfnew = pd.SparseDataFrame(spmtx, dtype=np.uint8, index=df.index,
                               columns=[col + '_' + str(el) for el in vals])
    dfnew.fillna(0, inplace=True)
    return dfnew

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

pd.get_dummies() 在大级别上缓慢 的相关文章

  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • Python逻辑运算符优先级[重复]

    这个问题在这里已经有答案了 哪个运算符优先4 gt 5 or 3 lt 4 and 9 gt 8 这会被评估为真还是假 我知道该声明3 gt 4 or 2 lt 3 and 9 gt 10 显然应该评估为 false 但我不太确定 pyth
  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • 将数据帧行转换为字典

    我有像下面的示例数据这样的数据帧 我正在尝试将数据帧中的一行转换为类似于下面所需输出的字典 但是当我使用 to dict 时 我得到了索引和列值 有谁知道如何将行转换为像所需输出那样的字典 任何提示都非常感激 Sample data pri
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 更改 `base_compiledir` 以将编译后的文件保存在另一个目录中

    theano base compiledir指编译后的文件存放的目录 有没有办法可以永久设置theano base compiledir到不同的位置 也许通过修改一些内部 Theano 文件的内容 http deeplearning net
  • 使用 OLS 回归预测未来值(Python、StatsModels、Pandas)

    我目前正在尝试在 Python 中实现 MLR 但不确定如何将我找到的系数应用于未来值 import pandas as pd import statsmodels formula api as sm import statsmodels
  • 如何从Python中的字符串中提取变量名称和值

    我有一根绳子 data var1 id 12345 name John White python中有没有办法将var1提取为python变量 更具体地说 我对字典变量感兴趣 这样我就可以获得变量的值 id和name python 这是由提供
  • Numpy 过滤器平滑零区域

    我有一个 0 及更大整数的 2D numpy 数组 其中值代表区域标签 例如 array 9 9 9 0 0 0 0 1 1 1 9 9 9 9 0 7 1 1 1 1 9 9 9 9 0 2 2 1 1 1 9 9 9 8 0 2 2 1
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • Pandas 根据 diff 列形成簇

    我正在尝试使用 Pandas 根据表示时间 以秒为单位 的列中的差异来消除数据框中的一些接近重复项 例如 import pandas as pd numpy as np df pd DataFrame 1200 1201 1233 1555
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • Python 将日志滚动到变量

    我有一个使用多线程并在服务器后台运行的应用程序 为了无需登录服务器即可监控应用程序 我决定包括Bottle http bottlepy org为了响应一些HTTP端点并报告状态 执行远程关闭等 我还想添加一种查阅日志文件的方法 我可以使用以
  • 使用yield 进行字典理解

    作为一个人为的例子 myset set a b c d mydict item yield join item s for item in myset and list mydict gives as cs bs ds a None b N
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 字典和数组作为类变量与实例变量

    这是赚取积分的简单方法 请解释以下内容 class C a b 0 c def init self self x def d self k v self x k v self a k v self b v self c append v d
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • 并非 ACCOUNT 权限组中的所有权限都会自动授予

    在我的应用程序中 我需要以下权限来创建帐户
  • 丝带和星星 - 如何在没有图像文件的情况下完成此操作?

    我需要在没有图像文件的情况下创建这个丝带和星星外观 附加图像 我知道如何将星星放入其中 但我需要像所附图像那样的丝带侧面 如果没有图像文件 只有纯 CSS 和 HTML 我该如何做到这一点 我认为需要在这里操纵边界半径 这就是我到目前为止所
  • $geoNear(聚合管道)未返回正确的文档

    使用时我没有得到正确的结果 geoNear在聚合管道中 使用典型的 find 查询的相同查询 使用 near 实际上确实返回了正确的结果 BUT 当删除相等条件时 在schedule key 两个查询都返回正确的数据 geoNear使用聚合
  • 如何通过拖放交换jtable中单元格的值

    我想将表的数据从一个表交换到同一列中的另一个表 注意 我只有两列 我的问题是我无法交换该值 另外 我希望仅在同一列上启用交换 否则表值将重置为其原始值 这是我的代码 JTable table 1 new JTable model table
  • Karate API 测试 - 从响应中删除重复值并将其与新响应进行比较

    我有一个场景 作为响应 我收到重复的值 And def abcName ListDataSet Response rowData 4 并打印 abcName BP Part Sht NCA MS BP Part Sht NCA MS BP
  • AutoHotKey 每隔执行一次就复制 (Ctrl-C) 出现奇怪问题

    我是编写自己的 AutoHotKey 脚本的新手 所以这一定是我在这里缺少的一些愚蠢的东西 The intent of the script is for the user to select some text and press the
  • Inno Setup:如何为“选择目标位置”页面指定多个目录?

    我有一个安装程序 其中包含 32 位和 64 位 dll 在 64 位系统上我想安装两个版本 在 32 位系统上 只安装 32 位版本 My Files 部分内容如下 Files Source C Users x64 my dll Dest
  • php mysqli_connect:客户端未知的身份验证方法[caching_sha2_password]

    我正在使用 PHPmysqli connect用于登录 MySQL 数据库 全部在本地主机上
  • 验证从 read 传入 bash 的参数数量

    我有一个关于验证有关用户在 bash 脚本中传递的参数数量的用户输入的问题 例如 如果我使用 if eq 2 then 这将检查是否有两个参数从命令行传递 如下所示 somescript sh arg1 arg2 但是如何验证用户在询问时是
  • 如何将树形视图转换为 xml?

    我目前正在开发一个项目 我需要将树视图转换为 xml 以便我可以将该 xml 数据发送到另一个端口 private void button1 Click object sender EventArgs e var rootElement n
  • 使用 Microsoft Graph 更改 Azure AD 的密码

    我原本计划使用 Azure AD Graph API 但后来在 Microsoft 文档中注意到有关使用 Microsoft Graph API 的建议 是否提供了更改用户密码的文档 string result Task Run async
  • 在 PHP 中执行字符串连接的最佳方法是什么?

    在 php 中 我们可以通过多种方式附加字符串 Method 1 sql SELECT field1 sql field2 sql field3 sql field4 sql FROM table1 sql WHERE condition1
  • 确保至少选中一个复选框

    我有一个带有多个复选框的表单 我想使用 JavaScript 来确保至少选中一个 这就是我现在所拥有的 但无论选择什么 都会弹出警报 JS 错误 function valthis if document FC c1 checked aler
  • 从日历中删除选定的事件

    我正在使用 JQuery Full Calendar 和 Spring MVC 你好 我做了一个演示 比如that 目标 我需要当用户单击她 他已经插入的事件时 出现一个对话框 并让他 她能够删除该事件或取消 问题 现在 每当用户单击任何一
  • 谷歌静态地图使用的两个相互矛盾的陈述

    我发现关于 google stati 地图 api 的限制使用的两个相互矛盾的陈述 根据这个链接 每天允许使用 25 000 次 根据这个链接每天允许使用 1000 次 现在我很困惑哪个是正确的 25000 是每个站点的限制 1000 是每
  • jQuery - 将方法应用于多个对象

    我想对许多声明的变量运行相同的方法 例如 说我有 var searchBtn search var signInBtn signin signInBtn removeClass active searchBtn removeClass ac
  • 将经过训练的超正方文件合并为一个

    我在 Mac 上使用最新版本的 Tesseract 我在一个文件夹中有一个 eng traineddata 在另一个文件夹中有一个 eng traineddata 我希望将我的训练数据文件合并到一个大的训练字体文件中 谁能告诉我该怎么做 我
  • C# 中的骨架化 OpenCV

    任何人都可以给我一个例子 说明如何在不使用距离变换的情况下进行骨架化 或者如果您有使用距离跑步变换的骨架化 我有一个用 C 编写的 OpenCV 示例 更多不起作用 cvlib CvDistTransform pimg ref ref ti
  • 在 ListModel 中传递数组

    我想知道如何在 ListModel 中传递数组 好的 在 QML 中我有一个 ListView 我将其设置为ListModel像这样 model ListModel id myList ListElement name card 0 boo
  • pd.get_dummies() 在大级别上缓慢

    我不确定这是否已经是最快的方法 或者我是否这样做效率低下 我想对一个具有 27k 可能级别的特定分类列进行热编码 该列在 2 个不同的数据集中具有不同的值 因此我在使用 get dummies 之前首先组合了级别 def hot encod