|
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 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中是否有空元素,只需要稍加改变- 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 1age 2salary 2dtype: 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 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参数,下面代码的效果与之前填充一致。- 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 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】 我们会及时删除侵权内容,谢谢合作! |
|