Pandas 中缺失值NaN的判断, 删除 及 替换

当使用pandas读取csv文件时,如果元素为空,则将其视为缺失值NaN(Not a Number, 非数字)。

使用dropna()方法删除缺失值,使用fillna()方法用其他值替换(填充)缺失值。

如果要提取包含缺失值的行或列,使用isnull()方法确定元素是否缺失。

例如,读取并使用包含带read_csv的空格的csv文件。

import pandas as pd
import numpy as np
import math

df = pd.read_csv('./data/05/sample_pandas_normal_nan.csv')
print(df)

使用pandas.isnull() 检查所有缺失的值:

print(df.isnull())

print(pd.isnull(df))

检查 ‘name’ 列缺失的值:

print(df['name'].isnull())

Name: name, dtype: bool

也可以使用numpy.isnan() 和math.isnan() (但是需要分别导入NumPy和math):

print(pd.isnull(df.at[0, 'point']))
print(np.isnan(df.at[0, 'point']))
print(math.isnan(df.at[0, 'point']))

在Pandas中,将None,np.nan,math.nan和pd.np.nan视为缺失值NaN

s_nan = pd.Series([None, np.nan, math.nan, pd.np.nan])
print(s_nan)

print(s_nan[0])
print(type(s_nan[0]))

print(s_nan.isnull())

使用dropna()方法删除缺失值。

默认情况下,将返回新对象,并且不会更改原始对象,但是参数inplace = True会更改原始对象本身。

print(df)

如果指定了参数how =’all’,则将删除所有缺少值的行。

print(df.dropna(how='all'))

如果设置axis = 1,则将删除所有缺少值的列。

print(df.dropna(how='all', axis=1))

删除所有缺少值的行和列的数据:

df2 = df.dropna(how='all').dropna(how='all', axis=1)
print(df2)

基于上面删除所有缺少值的行和列的数据df2 :

print(df2)

如果指定了参数how =’any’,则将删除至少包含一个缺失值的行。默认值为how =’any’。

print(df2.dropna(how='any'))

print(df2.dropna())

如果设置axis = 1,则将删除包含至少一个缺失值的列将被删除。

print(df2.dropna(how='any', axis=1))

通过在参数thresh中指定数字,可以根据不缺少值的元素数量删除行和列。

例如,如果thresh = 3,则保留包含三个或更多个不丢失值的元素的行,并删除其他行(包含两个或更多个不丢失值的元素的行)。

print(df.dropna(thresh=3))

如果axis= 1,则应用于列。

print(df.dropna(thresh=3, axis=1))

如果要基于特定的行/列删除,请在列表的参数子集中指定要定位的行/列标签。由于它必须是列表,因此请至少指定一个目标,例如subset = [‘name’]。 默认情况下,子集指定的列中缺少值的行将被删除。

print(df.dropna(subset=['age']))

如果指定了多列,则默认为删除所有缺少指定值的行。

print(df.dropna(subset=['age', 'state']))

如果参数how =’all’,则仅删除所有指定列均缺少值的行。

print(df.dropna(subset=['age', 'state'], how='all'))

可以使用fillna()方法将缺失值替换为任意值。

默认情况下,将返回新对象,并且不会更改原始对象,但是参数inplace = True会更改原始对象本身。

print(df)

如果指定要用参数替换的值,则所有缺少的值NaN都将替换为该值。

print(df.fillna(0))

将字典指定为参数时,每列将替换一个不同的值。字典键是列标签(列名),而值是要替换的值。未指定的列仍缺少值NaN。

print(df.fillna({'name': 'XXX', 'age': 20, 'point': 0}))

不仅可以指定字典,还可以指定pandas.Series。具有与pandas.Series中的标签匹配的列标签(列名)的列中缺少的值将替换为pandas.Series值。与pandas.Series标签不对应的列仍然缺少值。

s_for_fill = pd.Series(['ZZZ', 100], index=['name', 'age'])
print(s_for_fill)

print(df.fillna(s_for_fill))

可以使用mean()方法计算每列的平均值。结果是pandas.Series。缺失值将被排除并计算。

print(df.mean())

如果将此pandas.Series指定为fillna()的参数,则如上所述,将相应列中的缺失值替换为平均值。

print(df.fillna(df.mean()))

同样,如果要替换中位数,请使用中位数()方法。在偶数的情况下,两个中心值的平均值是中值。

print(df.fillna(df.median()))

通过使用method参数,可以替换之前和之后的值,而不是指定的值。 如果method =’ffill’,它将被以前的值替换;如果method =’bfill’,将被后面的值替换。对于时间序列数据很有用。

print(df.fillna(method='ffill'))

print(df.fillna(method='bfill'))

使用参数limit,可以指定连续替换的最大数量。

print(df.fillna(method='bfill', limit=1))

参考博客:

Original: https://blog.csdn.net/u012856866/article/details/122303273
Author: 酒酿小圆子~
Title: Pandas 中缺失值NaN的判断, 删除 及 替换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/640226/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球