我从具有大量列(〜20000)的上游组件接收Pandas DataFrame,它们都具有dtypes float64
,并且大多数条目是NaN
(这是一词袋编码文档)。示例:
1 2.0 NaN 1.0 NaN NaN NaN 1.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN 1.0 NaN 4.0 NaN 1.0 NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
我需要将此数据帧转换为密集的int
进行进一步处理(在这种情况下,int8
就足够了)。我知道在Pandas中,您可以像这样转换和填充缺失的值
df.fillna(0).astype(np.int8)
问题在于,代码一旦开始填充缺失值,就会很快溢出内存并崩溃。
此刻,我正在将数据帧保存在磁盘上,并用另一个脚本逐行处理(将浮点数转换为整数并将NaN替换为0),然后熊猫再次将其读取为{{1} }(int8
。
结果(包含pd.read_csv("preprocessed.csv", dtype=np.int8)
值的数据帧)适合内存。
我的问题-是否有一些有效的方法可以在熊猫中进行此转换(将int8
转换为float64
,同时将NaN替换为0)而不会导致内存溢出? (原始数据帧和所需数据帧都适合内存,只是上述熊猫代码不适合)
答案 0 :(得分:1)
您似乎对内存有限制。在这种情况下,请尽量不要连锁操作。那是:
df = df.fillna(0)
df = df.astype('int8')
或者如果行少于列,则在行上使用apply
:
df = df.apply(lambda x: x.fillna(0).astype('int8'), axis=1)
但是,由于csv文件中的大多数单元格都是空字符串,所以我认为您可能会做得更好:
df = pd.read_csv('file.csv', dtype='str')
答案 1 :(得分:0)
以块为单位进行转换,而不是一次全部