插件窝 干货文章 pandas dataframe统计填充空值方式

pandas dataframe统计填充空值方式

nan False class salary 178    来源:    2024-10-17

1.判断dataframe是否有空值

def t2():
    df = pd.DataFrame({
        'name': ['lili', 'lucy','pegga','alin',np.nan],
        'age': [18, 16, np.nan, 23, np.nan],
        'salary': [np.nan, 300, np.nan, 1000, 800]
    })
    df_contains_nan = df.isnull()
    print(df_contains_nan)

    df_contains_nan_2 = df.isna()
    print(df_contains_nan_2)

上面的代码将输出

    name    age  salary
0  False  False    True
1  False  False   False
2  False   True    True
3  False  False   False
4   True   True   False
    name    age  salary
0  False  False    True
1  False  False   False
2  False   True    True
3  False  False   False
4   True   True   False

isnull,isna方法都是判断df中的元素是否为空,然后输出True/False。

要判断df中是否有空元素,只需要稍加改变

def t3():
    df = pd.DataFrame({
        'name': ['lili', 'lucy','pegga','alin',np.nan],
        'age': [18, 16, np.nan, 23, np.nan],
        'salary': [np.nan, 300, np.nan, 1000, 800]
    })
    contains_nan = df.isnull().values.any()
    print(contains_nan)

any方法只要ndarray中有任意一个元素为True就返回True。

    def any(self, axis=None, out=None, keepdims=False): # real signature unknown; restored from __doc__
        """
        a.any(axis=None, out=None, keepdims=False)
        
            Returns True if any of the elements of `a` evaluate to True.
        
            Refer to `numpy.any` for full documentation.
        
            See Also
            --------
            numpy.any : equivalent function
        """
        pass

2.统计空值个数

def t4():
    df = pd.DataFrame({
        'name': ['lili', 'lucy','pegga','alin',np.nan],
        'age': [18, 16, np.nan, 23, np.nan],
        'salary': [np.nan, 300, np.nan, 1000, 800]
    })

    # 每一列有多少个nan
    nan_column = df.isnull().values.astype(int).sum(axis=0)
    # 各列的nan个数
    nan_column_name = df.isnull().sum()
    print(nan_column)
    print('*'*10)
    print(nan_column_name)
    print('*'*10)
    # nan的总个数
    nan_all = df.isnull().sum().sum()
    print(nan_all)

[1 2 2]
**********
name      1
age       2
salary    2
dtype: int64
**********
5

上面的代码,展示了统计每行/列空值的个数,以及所有空值的个数。

3.按列填充空值

def t5():
    df = pd.DataFrame({
        'name': ['lili', 'lucy','pegga','alin',np.nan],
        'age': [18, 16, np.nan, 23, np.nan],
        'salary': [np.nan, 300, np.nan, 1000, 800]
    })
    print(df)

    df.name = df.name.fillna('unknown')
    df.age = df.age.fillna(df.age.mean())
    df.salary = df.salary.fillna(df.salary.max())

    print(df)

    name   age  salary
0   lili  18.0     NaN
1   lucy  16.0   300.0
2  pegga   NaN     NaN
3   alin  23.0  1000.0
4    NaN   NaN   800.0
      name   age  salary
0     lili  18.0  1000.0
1     lucy  16.0   300.0
2    pegga  19.0  1000.0
3     alin  23.0  1000.0
4  unknown  19.0   800.0

上面的代码,分别对name, age, salary列按固定值,当前列平均值,当前列最大值填充。

fillna函数有inplace参数,下面代码的效果与之前填充一致。

def t52():
    df = pd.DataFrame({
        'name': ['lili', 'lucy','pegga','alin',np.nan],
        'age': [18, 16, np.nan, 23, np.nan],
        'salary': [np.nan, 300, np.nan, 1000, 800]
    })
    print(df)

    df.name.fillna('unknown', inplace=True)
    df.age.fillna(df.age.mean(), inplace=True)
    df.salary.fillna(df.salary.max(), inplace=True)
    print(df)

4.按分组平均值填充

def t6():
    df = pd.DataFrame({
        'level': ['A','A','A','A','B','B','B','B','C','C','C'],
        'score': [2,1,3,np.nan,4,6,5,np.nan,7,9,np.nan],
    })

    fun = lambda x: x.fillna(df.groupby('level').score.mean()[x.level])
    df = df.apply(lambda x: fun(x), axis=1)
    # 以下一行代码也可以实现相同功能
    #df = df.apply(lambda x: x.fillna(df.groupby('level').score.mean()[x.level]), axis=1)
    print(df)

上面的代码,将score按level分组的平均值填充。

fun传入一行数据,然后通过分组值来获取当前分组的平均值,最后利用fillna来填充这个平均值即可。

代码输出如下:

   level  score
0      A    2.0
1      A    1.0
2      A    3.0
3      A    2.0
4      B    4.0
5      B    6.0
6      B    5.0
7      B    5.0
8      C    7.0
9      C    9.0
10     C    8.0

总结

以上为个人经验,希望对您有所帮助。