我正在处理一个大到几千兆字节的pandas数据帧,并且在一些列中我存储了布尔值,我希望保留有关NaN的信息,以及之前{{3}中提出的建议我对这些列使用int8
数据类型(其中1
表示True
,0
表示False
,-1
表示{{1} }})。现在我想对此数据帧的行执行NaN
- 操作(并且仅对上面的布尔列执行)。但是,这个问题有两种不同的方法。说我有:
ffill
我想得到:
df_sel = df.loc[bool_cols]
>>> print(df_sel)
0 1 2
0 1 0 1
1 1 -1 -1
2 0 -1 -1
3 0 0 -1
4 0 1 -1
以便行已向前填充。现在,在我使用 0 1 2
0 1 0 1
1 1 1 1
2 0 0 0
3 0 0 0
4 0 1 1
dtype之前,我可以使用int8
,但由于内存优化,我不得不诉诸df_sel.fillna(method='ffill', axis=1)
,但问题是我不能给这个函数一个df_sel.replace(-1, method='ffill')
参数,因此我只能填充列!
一个可能的解决方案是转置两次(axis=1
),但由于我正在处理这么大的数据集,这在计算上很昂贵且需要很长时间。我已经用不同的方式提出了这个问题(没有提到我的数据框的大小),并且question建议使用df_sel.T.replace(-1, method='ffill').T
,但我遇到了相同的内存问题(遇到df_sel.mask(df_sel == -1).ffill(axis=1)
& #39; s等)因为当再次用MemoryError
填充-1值时,它会回复到后面的float64
。比两次转换数据帧以获得相同结果更好的方法。