mgo*_*ser 7 python dataframe pandas
我有一个大型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
Run Code Online (Sandbox Code Playgroud)
如果您还有空间再添加一列,您可以添加一个带有随机值的列,然后您可以根据该随机值进行过滤以进行测试。这里我使用了 0 到 1 之间的统一值,但如果你想要不同的比例,你可以使用任何值。
df = pd.DataFrame({'one':[1,2,3,4,5,4,3,2,1], 'two':[6,7,8,9,10,9,8,7,6], 'three':[11,12,13,14,15,14,13,12,11]})
df['split'] = np.random.randint(0, 2, size=len(df))
Run Code Online (Sandbox Code Playgroud)
当然,这需要您有空间来添加全新的列 - 特别是如果您的数据很长,也许您没有。
例如,如果您的数据采用 csv 格式并且您知道行数,则另一个选项会起作用。对 执行与上面类似的操作randomint,但将该列表传递到skiprowsPandas 的参数中read_csv():
num_rows = 100000
all = range(num_rows)
some = np.random.choice(all, replace=False, size=num_rows/2)
some.sort()
trainer_df = pd.read_csv(path, skiprows=some)
rest = [i for i in all if i not in some]
rest.sort()
df = pd.read_csv(path, skiprows=rest)
Run Code Online (Sandbox Code Playgroud)
前面有点笨重,尤其是列表理解中的循环,并且在内存中创建这些列表是不幸的,但它在内存范围内仍然应该比仅创建一半数据的完整副本更好。
为了使其更加内存友好,您可以加载训练器子集,训练模型,然后用其余数据覆盖训练数据帧,然后应用模型。您将被困在随身携带的some东西rest中,但您永远不必同时加载两半数据。