【发布时间】:2016-10-28 15:03:15
【问题描述】:
我有一个大型 DataFrame,我想将其拆分为一个测试集和一个训练集以用于模型构建。但是,我不想复制 DataFrame,因为我达到了内存限制。
是否存在类似于 pop 但针对大段的操作,该操作将同时删除 DataFrame 的一部分并允许我将其分配给新的 DataFrame?像这样的:
# Assume I have initialized a DataFrame (called "all") which contains my large dataset,
# with a boolean column called "test" which indicates whether a record should be used for
# testing.
print len(all)
# 10000000
test = all.pop_large_segment(all[test]) # not a real command, just a place holder
print len(all)
# 8000000
print len(test)
# 2000000
【问题讨论】:
-
据我所知,一旦你完成任务,pandas 就会创建一个副本。如果你只存储训练和测试的索引,它会工作吗?
-
不回答这个问题,但也许还有其他相关的想法: - 你不能在加载时分割数据集吗? - 或者使用
dask(dask.pydata.org/en/latest) 之类的东西? -
我知道的唯一原因是分别从 HDF5 表中加载它们并在加载时进行拆分,即首先加载一些行作为训练,然后将其余行作为拆分 - 可以提供正确的答案是这听起来很合理......
-
在加载时拆分数据集是我在回答中建议的。唯一的障碍是您必须准确跟踪在训练集中加载了哪些行,然后加载其余的行,这会导致大量行变得笨重。你还必须确保你真的得到了一个公正的样本,否则你的训练就会被取消。这似乎是对 Pandas 机器学习能力的一个很好的补充。
-
DataFrames 没有“类似流行的东西”。 DataFrame 的大小是其身份的固有部分;没有办法让它变小或变大。您只能创建不同大小的新 DataFrame。 (看似改变DataFrame大小的操作,如
drop,实际上只是创建了一个新的DataFrame。)