用熊猫删除数据行会增加内存使用量

时间:2019-06-19 11:16:31

标签: python pandas dataframe

我有一个客户数据集,该数据集包含三列,一个键以及一个表示客户坐标的X和Y。

In [1]: customers                                                                              
Out[1]: 
                                         key          X          Y
0       b305b0b7-fb24-4eef-9055-827cf7f39b93        NaN        NaN
1       edf5e4bc-d553-4285-9de3-45165f96dd02   987269.0  6236836.0
2       00ded895-ae97-4d27-b317-91c6931662b7   880460.0  6267799.0
3       d957d117-72db-444f-ac9a-338c2034f5db   830645.0  6287647.0
4       ac504435-7eb8-4275-a3da-6f673ff324ae   837826.0  6293434.0

customers.info()返回:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 378195 entries, 0 to 378194
Data columns (total 3 columns):
cle    378195 non-null object
X      375850 non-null float64
Y      375850 non-null float64
dtypes: float64(2), object(1)
memory usage: 8.7+ MB

我仅使用以下方法保留具有X和Y值(而不是NaN)的数据点:

customers2 = customers[customers['X'].notna() & customers['Y'].notna()]

删除X或Y中带有任何NaN的行(索引0的示例)。

In [2]: customers2                                                                             
Out[2]: 
                                         cle          X          Y
1       edf5e4bc-d553-4285-9de3-45165f96dd02   987269.0  6236836.0
2       00ded895-ae97-4d27-b317-91c6931662b7   880460.0  6267799.0
3       d957d117-72db-444f-ac9a-338c2034f5db   830645.0  6287647.0
4       ac504435-7eb8-4275-a3da-6f673ff324ae   837826.0  6293434.0
5       5d4c8fe0-56ce-4498-a4ee-2fd4314abc1e   987025.0  6427374.0

尽管条目数有所减少(从378195减少到375850),但是此新数据帧的信息显示出更高的内存使用率:

In [2]: customers2.info()                                                                       
<class 'pandas.core.frame.DataFrame'>
Int64Index: 375850 entries, 1 to 378194
Data columns (total 3 columns):
cle    375850 non-null object
X      375850 non-null float64
Y      375850 non-null float64
dtypes: float64(2), object(1)
memory usage: 11.5+ MB

我无法解释原因,即使我仍然可以像普通数据帧一样继续操纵customers2

有什么解释吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我想说,由于您的索引,您的内存索引增加了,

RangeIndex: 378195 entries, 0 to 378194

及之后:

Int64Index: 375850 entries, 1 to 378194

Int64Index每个条目占用8个字节。

这是RangeIndex:https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.RangeIndex.html

您可以像这样将其转换回去

customers2.index = pd.RangeIndex(start=0, stop=len(customers2), step=1)