将大熊猫数据框从“稀疏” float转换为int

时间:2020-10-02 18:34:01

标签: python pandas numpy dataframe nan

我从具有大量列(〜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)而不会导致内存溢出? (原始数据帧和所需数据帧都适合内存,只是上述熊猫代码不适合)

2 个答案:

答案 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)

以块为单位进行转换,而不是一次全部

  • 从繁重的数据帧A开始
  • 创建一个新的数据框B
  • 从A到新数据帧C的复制范围(选择块大小以确保不溢出内存)
  • 将C中的范围转换为所需的类型(可以与上一步结合使用)
  • 删除A中的旧范围
  • 将C加入A
  • 重复执行,直到所有范围都被转换