Numpy 填充、降低内存使用和Pandas
在本文中,我们将介绍Numpy中的重要函数——fillna和downcast以及在Pandas中如何使用它们。
阅读更多:Numpy 教程
Numpy中的fillna函数
fillna函数是Numpy中的一个重要函数,可以用于将数组中的缺失值用一个标量或指定的值来填充。函数的语法如下:
numpy.fillna(value, method, axis, inplace)
- value:要用来填充缺失值的标量或指定的值。
- method:指定用何种方法填充缺失值。
- axis:指定填充方向。
- inplace:指定是否原地修改数组。
下面来详细介绍一下这些参数:
填充缺失值
首先,我们可以使用fillna函数来填充缺失值。假设我们有一个包含缺失值的数组a如下:
import numpy as np
a = np.array([[1,2,np.nan],
[4,np.nan,6],
[7,8,9]])
我们可以使用以下代码将缺失值全部填充为0:
np.fillna(a, 0)
输出如下:
array([[1., 2., 0.],
[4., 0., 6.],
[7., 8., 9.]])
用前一个值填充
除了使用标量填充缺失值之外,我们还可以使用前一个值来填充。方法是将method参数设置为’ffill’。例如,我们有以下数组:
b = np.array([[1,2,np.nan],
[np.nan,4,5],
[np.nan,np.nan,9]])
我们可以使用以下代码将缺失值用前一个值填充:
np.fillna(b, method='ffill')
输出如下:
array([[1., 2., nan],
[1., 4., 5.],
[1., 4., 9.]])
用后一个值填充
与使用前一个值填充类似,我们可以使用后一个值来填充缺失值。方法是将method参数设置为’bfill’。例如,我们有以下数组:
c = np.array([[1,np.nan,3],
[4,np.nan,np.nan],
[7,8,np.nan]])
我们可以使用以下代码将缺失值用后一个值填充:
np.fillna(c, method='bfill')
输出如下:
array([[1., 8., 3.],
[4., 8., 8.],
[7., 8., nan]])
在行或列上填充缺失值
我们还可以在行和列上填充缺失值。对于行向数组,我们可以将axis参数设置为1。对于列向数组,我们可以将axis参数设置为0。例如,我们有以下数组:
d = np.array([[1,np.nan,3],
[4,5,np.nan],
[7,np.nan,9]])
我们可以使用以下代码在行上填充缺失值:
np.fillna(d, method='ffill', axis=1)
输出如下:
array([[1., 1., 3.],
[4., 5., 5.],
[7., 7., 9.]])
我们可以使用以下代码在列上填充缺失值:
np.fillna(d, method='bfill', axis=0)
输出如下:
array([[1., 5., 3.],
[4., 5., 9.],
[7., nan, 9.]])
原地修改数组
最后一个参数inplace可以用于指定是否在原地修改数组。默认情况下,该参数为False。例如,我们有以下数组:
e = np.array([[1,np.nan,3],
[4,np.nan,6],
[7,np.nan,9]])
我们可以使用以下代码将缺失值用0填充,并原地修改数组:
np.fillna(e, 0, inplace=True)
输出如下:
array([[1., 0., 3.],
[4., 0., 6.],
[7., 0., 9.]])
Numpy中的downcast函数
downcast函数是Numpy中的另一个重要函数,可以用于将数组的数据类型降低为更小的数据类型,以降低内存使用。函数的语法如下:
numpy.downcast(a, dtype)
- a:要降低数据类型的数组。
- dtype:要降低至的数据类型。
下面来看一下示例:
f = np.array([1, 2, 3], dtype='int64')
print(f.dtype) # 输出 int64
np.downcast(f, 'int32')
print(f.dtype) # 输出 int32
输出结果如下:
int64
int32
可以看到,downcast函数成功将数组f的数据类型从int64降低为了int32。
Pandas中的fillna和downcast函数
Pandas也支持fillna和downcast函数,并且它们的使用方法与Numpy中的函数类似。下面分别介绍一下:
Pandas中的fillna函数
与Numpy中的fillna函数类似,Pandas中的fillna函数也可以用于将缺失值填充为指定的值或使用前一个/后一个值进行填充。假设我们有以下DataFrame:
import pandas as pd
data = {'A': [1, 2, 3, None, 5],
'B': [None, 7, 8, 9, 10],
'C': [11, 12, None, None, 15]}
df = pd.DataFrame(data)
我们可以使用以下代码将缺失值全部填充为0:
df.fillna(0)
输出如下:
A B C
0 1.0 0.0 11.0
1 2.0 7.0 12.0
2 3.0 8.0 0.0
3 0.0 9.0 0.0
4 5.0 10.0 15.0
我们可以使用以下代码将缺失值用前一个值填充:
df.fillna(method='ffill')
输出如下:
A B C
0 1.0 NaN 11.0
1 2.0 7.0 12.0
2 3.0 8.0 12.0
3 3.0 9.0 12.0
4 5.0 10.0 15.0
我们可以使用以下代码将缺失值用后一个值填充:
df.fillna(method='bfill')
输出如下:
A B C
0 1.0 7.0 11.0
1 2.0 7.0 12.0
2 3.0 8.0 15.0
3 5.0 9.0 15.0
4 5.0 10.0 15.0
Pandas中的downcast函数
Pandas中的downcast函数可以用于将DataFrame中所有数值列的数据类型降低为更小的数据类型。例如,我们有以下DataFrame:
data = {'A': [1, 2, 3],
'B': [4.0, 5.0, 6.0],
'C': [True, False, True]}
df = pd.DataFrame(data)
可以使用以下代码将所有数值列的数据类型降低为int或float:
df[numeric_columns] = df[numeric_columns].apply(pd.to_numeric, downcast='integer')
df[numeric_columns]
输出结果如下:
A B C
0 1 4 True
1 2 5 False
2 3 6 True
可以看到,downcast函数成功将所有数值列的数据类型从float64降低为了int64。
总结
Numpy的fillna和downcast函数可以用于填充缺失值和降低内存使用,而Pandas也支持类似的fillna和downcast函数,并且使用方法也非常类似。在实际的数据分析和处理中,这些函数都是非常重要的。希望本文对大家有所帮助。
极客笔记