1. 返回数组类型
import pandas as pdimport numpy as npa = np.nanprint(type(a))print('当数组中有nan时,无论其他数据是什么类型,使用dtype返回的都是float64')val = np.array(([2, 1, 3, 4]))print(val.dtype)val = np.array(([2.1, 1, 3, 4]))print(val.dtype)val = np.array(([2, np.nan, 3.1, 4]))print(val.dtype)val = np.array(([2.2, np.nan, 3.1, 4.1]))print(val.dtype)val = np.array(([2, np.nan, 3, 4]))print(val.dtype)<class 'float'>当数组中有nan时,无论其他数据是什么类型,使用dtype返回的都是float64int32float64float64float64float64
2. 返回数组维度和各维度大小
print('ndim返回数组的维度')print(val.ndim)print('shape返回表示各维度大小的元组')print(val.shape)ndim返回数组的维度1shape返回表示各维度大小的元组(4,)
3. 类型转换
int32 —> float64 完全ok
float64 —> int32 会将小数部分截断
string_ —> float64 如果字符串数组表示的全是数字,也可以用astype转化为数值类型
print('astype改变数组的元素类型')arr1 = np.array(([1., 2., 3.]))arr2 = arr1.astype('int32')print(arr1.dtype)print(arr2.dtype)float64int32
4. 与NaN数据做计算
与NaN数据做任何操作,结果都是NaN
print(1+np.nan, 2*np.nan)print(val.sum(), val.min(), val.max())nan nannan nan nan
# Noneval2 = np.array([1, None, 3, 4])print(val2)# print(val2.sum()) # None不能用与计算,直接使用这个会报错[1 None 3 4]
5. 发现缺失值
print('发现缺失值')data = pd.Series([1, np.nan, 'hello', None])print(data.isnull())print('不是空值的有哪些')print(data[data.notnull()])发现缺失值0 False1 True2 False3 Truedtype: bool不是空值的有哪些0 12 hellodtype: object
6. 删除缺失值
data2 = data.dropna()print(data)print(data2)0 11 NaN2 hello3 Nonedtype: object0 12 hellodtype: object
7. 剔除任何包含缺失值的数据
df = pd.DataFrame([[1, np.nan, 2],[2, 3, 5],[np.nan,4, 6]])print(df)print("dropna()默认剔除任何包含缺失值的整行数据")print(df.dropna())dropna()默认剔除任何包含缺失值的整行数据0 1 20 1.0 NaN 21 2.0 3.0 52 NaN 4.0 60 1 21 2.0 3.0 5
print('剔除任何包含缺失值的整列数据')print(df.dropna(axis='columns'))剔除任何包含缺失值的整列数据20 21 52 6
8. 加一列数据
print('加一列')df[3] = np.nanprint(df)加一列0 1 2 30 1.0 NaN 2 NaN1 2.0 3.0 5 NaN2 NaN 4.0 6 NaN
9. 剔除全是NaN的列
print(df.dropna(axis='columns', how='all'))0 1 20 1.0 NaN 21 2.0 3.0 52 NaN 4.0 6
10. 填充缺失值
1)fillna()函数
fillna(value=None, method=None, axis=None, inplace=False,limit=None, downcast=None, **kwargs)
- value:用于填充的空值的值。
- method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
- axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
- inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
- limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
- downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
2)填充特定字符
```python data = pd.Series([1, np.nan, 2, None, None, 3], index=list(‘abcdef’)) print(data) print(data.fillna(‘Missing’))
a 1.0 b NaN c 2.0 d NaN e NaN f 3.0 dtype: float64 a 1 b Missing c 2 d Missing e Missing f 3 dtype: object
<a name="djZfe"></a>## 3)用缺失值前面的有效值从前往后填充```pythondata = pd.Series([1, np.nan, 2, None, None, 3], index=list('abcdef'))print(data)print('用缺失值前面的有效值从前往后填充')print(data.fillna(method='ffill'))# 下列用法结果相同。print(data.fillna(method='pad'))a 1.0b NaNc 2.0d NaNe NaNf 3.0用缺失值前面的有效值从前往后填充a 1.0b 1.0c 2.0d 2.0e 2.0f 3.0dtype: float64
4)用缺失值后面的有效值从后往前填充
data = pd.Series([1, np.nan, 2, None, None, 3], index=list('abcdef'))print(data)print('用缺失值前面的有效值从前往后填充')print(data.fillna(method='backfill'))# 下列用法结果相同。print(data.fillna(method='bfill'))a 1.0b NaNc 2.0d NaNe NaNf 3.0用缺失值前面的有效值从前往后填充a 1.0b 2.0c 2.0d 3.0e 3.0f 3.0dtype: float64
5)用缺失值前后有效值构建等差数列填充
用到了interpolate函数
DataFrame.interpolate(method=‘linear’, axis=0, limit=None, inplace=False,limit_direction=None, limit_area=None, downcast=None, **kwargs)
method : str,默认为‘linear’,使用插值技术。之一:‘linear’:忽略索引,并将值等距地对待。这是MultiIndexes支持的唯一方法。‘time’: 处理每日和更高分辨率的数据,以内插给定的时间间隔长度。‘index’, ‘values’: 使用索引的实际数值。‘pad’:使用现有值填写NaN。‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’: 传递给 scipy.interpolate.interp1d。这些方法使用索引的数值。‘polynomial’ 和 ‘spline’ 都要求您还指定一个顺序(int),例如 :df.interpolate(method=’polynomial’, order=5)
‘krogh’, ‘piecewise_polynomial’, ‘spline’,’pchip’,’akima’:环绕类似名称的SciPy插值方法。请参阅注释。
axis : {0或’index’,1或’columns’,None},默认为None,沿轴进行interpolate。
limit : 整数,可选,要填充的连续NaN的最大数量。必须大于0。
inplace : bool,默认为False尽可能更新数据。
limit_direction : {‘forward’,’backward’,’both’},默认为’forward’,如果指定了限制,则将沿该方向填充连续的NaN。
limit_area : {None, ‘inside’, ‘outside’}, 默认为None,如果指定了限制,则连续的NaN将填充此限制。None:无填充限制。‘inside’:仅填充有效值(interpolate)包围的NaN。‘outside’: 仅在有效值之外(extrapolate)填充NaN。0.23.0版中的新功能。
downcast : 可选, ‘infer’ 或None,默认为None,如果可能,请向下转换dtype。
**kwargs,关键字参数传递给插值函数。
data = pd.Series([1, np.nan, 2, None, None, 3], index=list('abcdef'))data1 = pd.DataFrame({"score": data})print(data1)print('用缺失值前后的平均值填充')print(data.fillna(data1['score'].interpolate(limit_direction='both')))scorea 1.0b NaNc 2.0d NaNe NaNf 3.0用缺失值前后的平均值填充a 1.000000b 1.500000c 2.000000d 2.333333e 2.666667f 3.000000# 也可以直接使用interpolate()函数data = pd.Series([1, np.nan, 2, None, None, 3], index=list('abcdef'))print(data)print(data.interpolate())a 1.0b NaNc 2.0d NaNe NaNf 3.0dtype: float64a 1.000000b 1.500000c 2.000000d 2.333333e 2.666667f 3.000000
