翼度科技»论坛 编程开发 python 查看内容

pandas dataframe统计填充空值方式

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
1.判断dataframe是否有空值
  1. def t2():
  2.     df = pd.DataFrame({
  3.         'name': ['lili', 'lucy','pegga','alin',np.nan],
  4.         'age': [18, 16, np.nan, 23, np.nan],
  5.         'salary': [np.nan, 300, np.nan, 1000, 800]
  6.     })
  7.     df_contains_nan = df.isnull()
  8.     print(df_contains_nan)

  9.     df_contains_nan_2 = df.isna()
  10.     print(df_contains_nan_2)
复制代码
上面的代码将输出
  1.     name    age  salary0  False  False    True1  False  False   False2  False   True    True3  False  False   False4   True   True   False    name    age  salary0  False  False    True1  False  False   False2  False   True    True3  False  False   False4   True   True   False
复制代码
isnull,isna方法都是判断df中的元素是否为空,然后输出True/False。
要判断df中是否有空元素,只需要稍加改变
  1. def t3():
  2.     df = pd.DataFrame({
  3.         'name': ['lili', 'lucy','pegga','alin',np.nan],
  4.         'age': [18, 16, np.nan, 23, np.nan],
  5.         'salary': [np.nan, 300, np.nan, 1000, 800]
  6.     })
  7.     contains_nan = df.isnull().values.any()
  8.     print(contains_nan)
复制代码
any方法只要ndarray中有任意一个元素为True就返回True。
  1.     def any(self, axis=None, out=None, keepdims=False): # real signature unknown; restored from __doc__
  2.         """
  3.         a.any(axis=None, out=None, keepdims=False)
  4.         
  5.             Returns True if any of the elements of `a` evaluate to True.
  6.         
  7.             Refer to `numpy.any` for full documentation.
  8.         
  9.             See Also
  10.             --------
  11.             numpy.any : equivalent function
  12.         """
  13.         pass
复制代码
2.统计空值个数
  1. def t4():
  2.     df = pd.DataFrame({
  3.         'name': ['lili', 'lucy','pegga','alin',np.nan],
  4.         'age': [18, 16, np.nan, 23, np.nan],
  5.         'salary': [np.nan, 300, np.nan, 1000, 800]
  6.     })

  7.     # 每一列有多少个nan
  8.     nan_column = df.isnull().values.astype(int).sum(axis=0)
  9.     # 各列的nan个数
  10.     nan_column_name = df.isnull().sum()
  11.     print(nan_column)
  12.     print('*'*10)
  13.     print(nan_column_name)
  14.     print('*'*10)
  15.     # nan的总个数
  16.     nan_all = df.isnull().sum().sum()
  17.     print(nan_all)
复制代码
  1. [1 2 2]**********name      1age       2salary    2dtype: int64**********5
复制代码
上面的代码,展示了统计每行/列空值的个数,以及所有空值的个数。

3.按列填充空值
  1. def t5():
  2.     df = pd.DataFrame({
  3.         'name': ['lili', 'lucy','pegga','alin',np.nan],
  4.         'age': [18, 16, np.nan, 23, np.nan],
  5.         'salary': [np.nan, 300, np.nan, 1000, 800]
  6.     })
  7.     print(df)

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

  11.     print(df)
复制代码
  1.     name   age  salary0   lili  18.0     NaN1   lucy  16.0   300.02  pegga   NaN     NaN3   alin  23.0  1000.04    NaN   NaN   800.0      name   age  salary0     lili  18.0  1000.01     lucy  16.0   300.02    pegga  19.0  1000.03     alin  23.0  1000.04  unknown  19.0   800.0
复制代码
上面的代码,分别对name, age, salary列按固定值,当前列平均值,当前列最大值填充。
fillna函数有inplace参数,下面代码的效果与之前填充一致。
  1. def t52():
  2.     df = pd.DataFrame({
  3.         'name': ['lili', 'lucy','pegga','alin',np.nan],
  4.         'age': [18, 16, np.nan, 23, np.nan],
  5.         'salary': [np.nan, 300, np.nan, 1000, 800]
  6.     })
  7.     print(df)

  8.     df.name.fillna('unknown', inplace=True)
  9.     df.age.fillna(df.age.mean(), inplace=True)
  10.     df.salary.fillna(df.salary.max(), inplace=True)
  11.     print(df)
复制代码
4.按分组平均值填充
  1. def t6():
  2.     df = pd.DataFrame({
  3.         'level': ['A','A','A','A','B','B','B','B','C','C','C'],
  4.         'score': [2,1,3,np.nan,4,6,5,np.nan,7,9,np.nan],
  5.     })

  6.     fun = lambda x: x.fillna(df.groupby('level').score.mean()[x.level])
  7.     df = df.apply(lambda x: fun(x), axis=1)
  8.     # 以下一行代码也可以实现相同功能
  9.     #df = df.apply(lambda x: x.fillna(df.groupby('level').score.mean()[x.level]), axis=1)
  10.     print(df)
复制代码
上面的代码,将score按level分组的平均值填充。
fun传入一行数据,然后通过分组值来获取当前分组的平均值,最后利用fillna来填充这个平均值即可。
代码输出如下:
  1.    level  score0      A    2.01      A    1.02      A    3.03      A    2.04      B    4.05      B    6.06      B    5.07      B    5.08      C    7.09      C    9.010     C    8.0
复制代码
总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

来源:https://www.jb51.net/python/3161508ot.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具