- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在处理包含 400,000 行和 300 个变量的数据集时遇到问题。我必须为包含 3,000 多个不同项目的分类变量获取虚拟变量。最后,我想得到一个包含 3,300 个变量或特征的数据集,以便我可以训练 RandomForest 模型。
这是我尝试做的:
df = pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1)
当我这样做时,我总是会遇到内存错误。我可以拥有的变量数量是否有限制?
如果我只对前 1,000 行(有 374 个不同的类别)执行此操作,它就可以正常工作。
有人能解决我的问题吗?我使用的计算机有 8 GB 的内存。
最佳答案
更新:从0.19.0版本开始,get_dummies返回一个8位整数而不是64位 float ,这将在很多情况下解决这个问题并做出下面的as_type
解决方案不必要。请参阅:get_dummies -- pandas 0.19.0
但在其他情况下,下面描述的 sparse
选项可能仍然有用。
原始答案:这里有几个尝试的可能性。两者都将大大减少数据帧的内存占用,但您以后仍可能遇到内存问题。这很难预测,您只需要尝试一下。
(请注意,我正在简化下面 info()
的输出)
df = pd.DataFrame({ 'itemID': np.random.randint(1,4,100) })
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_')], axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 3.5 KB
这是我们的基准。每个虚拟列占用 800 字节,因为示例数据有 100 行,并且 get_dummies
似乎默认为 float64(8 字节)。这似乎是一种不必要的低效存储虚拟对象的方法,因为您可以尽可能少地使用它,但可能有一些我不知道的原因。
所以,第一次尝试,只需更改为一个字节的整数(这似乎不是 get_dummies
的选项,因此必须通过 astype(np .int8)
.
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_').astype(np.int8)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null int8
itemID__2 100 non-null int8
itemID__3 100 non-null int8
memory usage: 1.5 KB
现在每个虚拟列占用内存的 1/8 和以前一样。
或者,您可以使用 get_dummies
的 sparse
选项。
pd.concat([df, pd.get_dummies(df['itemID'],prefix = 'itemID_',sparse=True)],
axis=1).info()
itemID 100 non-null int32
itemID__1 100 non-null float64
itemID__2 100 non-null float64
itemID__3 100 non-null float64
memory usage: 2.0 KB
相当可观的节省。 info()
输出在某种程度上隐藏了节省发生的方式,但您可以查看内存使用值以了解总节省。
其中哪些在实践中效果更好取决于您的数据,因此您只需要分别尝试一下(或者您甚至可以将它们结合起来)。
关于python - get_dummies python内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31321892/
在使用 get_dummies() 将分类数据转换为数字数据后,我的数据框看起来像这样 score1 score2 country_CN country _AU category_leader ca
我有需要应用单热编码的标记数据:'786.2', 'ICD-9-CM|786.2', ' ICD-9-CM', '786.2b|V13.02', 'V13.02', '279.12' , 'ICD-9
在包含有关文本文件中字符串信息的字典中,其中键是字符串,值是文件名。 Dict1 = {'str1A':'file1', 'str1B':'file1', 'str1C':'file1', 'str1
我需要对 userId X movieId 进行分类,我有两列:userId 和 movieId。 userId movieId 60265 2123 60265 2291 60265
我在处理包含 400,000 行和 300 个变量的数据集时遇到问题。我必须为包含 3,000 多个不同项目的分类变量获取虚拟变量。最后,我想得到一个包含 3,300 个变量或特征的数据集,以便我可以
我有一个具有以下架构的 pyspark 数据框: Key1Key2Key3值一个一个一个"value1"一个一个一个"value2"一个一个b"value1"bb一个"value2" (在现实生活中这
我正在研究一个数据集,它有一个称为类别的功能。该特征中每个观察的数据由分号分隔的列表组成,例如。 行 类别 第 1 行 "categorya;categoryb;categoryc" 第 2 行 “类
我正在努力为我的数据框创建虚拟列。 这是我的原始数据框: df = pd.DataFrame({'id': ['01', '02', '03'], 'Q1':
使用以下数据框: >>> df = pd.DataFrame(data={'category':['a','b','c'],'val':[1,2,3]}) >>> df category val
所以本质上我有一个包含一堆列的数据框,其中一些我想保留(存储在 to_keep 中),还有一些其他列我想使用 pandas.get_dummies 创建分类变量(这些列存储在 to_change 中)
我正在使用 pandas 系列并尝试将其转换为一种热门编码。我使用 describe 方法来检查该系列有多少个独特的类别。输出为: input['pattern'].describe(include=
我有一个 Pandas DataFrame,df。它由数字变量和分类变量组成,其中包含 NaN/NULL 值。要继续进行数据预处理,我必须对 calcategori 变量进行 one-hot 编码,并
我正在制作一个简单的可重现示例来了解培训和测试的工作原理: 示例 我想根据原产地位置预测年龄: import pandas as pd # create a simple dataset of peo
我有这个数据框: column1 column2 column3 column4 0 A A D D 1 B
这个问题已经有答案了: Dummy variables when not all categories are present (10 个回答) 已关闭 5 年前。 使用 get_dummies 方法
你好,有一个包含分类变量的 Pandas 数据框 df。 df=pandas.DataFrame(data=[['male','blue'],['female','brown'], ['male','
我有一个如下所示的数据框。 Mfr Number 列是分类数据类型。我想对其执行 get_dummies 或一种热编码,但如果它来自该行,我不想用 1 填充新列,而是希望它填充 数量列。所有其他新的“
我有一个 Pandas DataFrame,train,我是单热编码。它看起来像这样: car 0 Mazda 1 BMW 2 Honda 如果我使用 pd.get_dummies
(已编辑:我刚刚意识到我想问一个无法回答但不确定如何删除这个问题的问题...请忽略或建议我如何删除。我想我需要考虑一个不同的解决这个问题的方法。) ******--------------------
我希望利用 pandas get_dummy() 功能来编码一组(相当广泛的)分类变量。但是,数据当前采用嵌套表格格式。这意味着每一行代表另一个变量实例,例如 Instance, Cat_Col 1,
我是一名优秀的程序员,十分优秀!