首页 > 其他分享 >数据分析之Pandas缺失数据处理

数据分析之Pandas缺失数据处理

时间:2023-08-04 15:37:48浏览次数:44  
标签:数据分析 df Series nan np pd dtype 数据处理 Pandas


 Datawhale干货 

作者:耿远昊,Datawhale成员,华东师范大学

Pandas 是一个强大的分析结构化数据的工具集,它的使用基础是Numpy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。

在往期文章中,已经详细讲解了Pandas做分析数据的四种基本操作:索引、分组、变形及合并。现在,开始正式介绍Pandas的数据结构类型:缺失数据、文本数据、分类数据和时序数据。

在接下来的两章中,会接触到数据预处理中比较麻烦的类型,即缺失数据和文本数据(尤其是混杂型文本)。今天,我们首先对缺失数据进行系统地梳理。

数据分析之Pandas缺失数据处理_插值

 本文目录

              1. 基础概念

                  1.1. 缺失值分类

                  1.2. 缺失值处理方法

  • 2. 缺失观测及其类型


  •     2.2. 三种缺失符号

  •     2.3. Nullable类型与NA符号

  •     2.4. NA的特性

  •     2.5. convert_dtypes方法

              3. 缺失数据的运算与分组 

3.1. 加号与乘号规则

                  3.2. groupby方法中的缺失值

               4. 填充与剔除

                4.1. fillna方法

                  4.2. dropna方法

               5. 插值

  •     5.1. 线性插值

  •     5.2. 高级插值方法  

  •     5.3. interpolate中的限制参数

  •  6. 问题及练习

  •     6.1. 问题

  •     6.2. 练习

import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()
df['Physics'].isna().head()
df['Physics'].notna().head()
df.isna().head()
df.isna().sum()
df.info()
df[df['Physics'].isna()]
df[df.notna().all(1)]
np.nan == np.nan
np.nan == 0
np.nan == None
df.equals(df)
type(np.nan)
pd.Series([1,2,3]).dtype
pd.Series([1,np.nan,3]).dtype
pd.Series([1,np.nan,3],dtype='bool')
s = pd.Series([True,False],dtype='bool')
s[1]=np.nan
s
df['ID'].dtype
df['Math'].dtype
df['Class'].dtype
None == None
pd.Series([None],dtype='bool')
s = pd.Series([True,False],dtype='bool')
s[0]=None
s
s = pd.Series([1,0],dtype='bool')
s[0]=None
s
type(pd.Series([1,None])[1])
type(pd.Series([1,None],dtype='O')[1])
pd.Series([None]).equals(pd.Series([np.nan]))
s_time = pd.Series([pd.Timestamp('20120101')]*5)
s_time
s_time[2] = None
s_time
s_time[2] = np.nan
s_time
s_time[2] = pd.NaT
s_time
type(s_time[2])
s_time[2] == s_time[2]
s_time.equals(s_time)
s = pd.Series([True,False],dtype='bool')
s[1]=pd.NaT
s
s_original = pd.Series([1, 2], dtype="int64")
s_original
s_new = pd.Series([1, 2], dtype="Int64")
s_new
s_original[1] = np.nan
s_original
s_new[1] = np.nan
s_new
s_new[1] = None
s_new
s_new[1] = pd.NaT
s_new
s_original = pd.Series([1, 0], dtype="bool")
s_original
s_new = pd.Series([0, 1], dtype="boolean")
s_new
s_original[0] = np.nan
s_original
s_original = pd.Series([1, 0], dtype="bool") #此处重新加一句是因为前面赋值改变了bool类型
s_original[0] = None
s_original
s_new[0] = np.nan
s_new
s_new[0] = None
s_new
s_new[0] = pd.NaT
s_new
s = pd.Series(['dog','cat'])
s[s_new]
s = pd.Series(['dog','cat'],dtype='string')
s
s[0] = np.nan
s
s[0] = None
s
s[0] = pd.NaT
s
s = pd.Series(["a", None, "b"], dtype="string")
s.str.count('a')
s2 = pd.Series(["a", None, "b"], dtype="object")
s2.str.count("a")
s.str.isdigit()
s2.str.isdigit()
True | pd.NA
pd.NA | True
False | pd.NA
False & pd.NA
True & pd.NA
#bool(pd.NA)
pd.NA ** 0
1 ** pd.NA
pd.NA + 1
"a" * pd.NA
pd.NA == pd.NA
pd.NA < 2.5
np.log(pd.NA)
np.add(pd.NA, 1)
pd.read_csv('data/table_missing.csv').dtypes
pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes
s = pd.Series([2,3,np.nan,4])
s.sum()
s.prod()
s.cumsum()
s.cumprod()
s.pct_change()
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})
df_g
df_g.groupby('one').groups
df['Physics'].fillna('missing').head()
df['Physics'].fillna(method='ffill').head()
df['Physics'].fillna(method='backfill').head()
df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})
df_f.fillna(df_f.mean())
df_f.fillna(df_f.mean()[['A','B']])
df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})
df_d
df_d.dropna(axis=0)
df_d.dropna(axis=1)
df_d.dropna(axis=1,how='all')
df_d.dropna(axis=0,subset=['B','C'])
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s
s.interpolate()
s.interpolate().plot()
s.index = np.sort(np.random.randint(50,300,8))
s.interpolate()
#值不变
s.interpolate().plot()
#后面三个点不是线性的(如果几乎为线性函数,请重新运行上面的一个代码块,这是随机性导致的)
s.interpolate(method='index').plot()
#可以看到与上面的区别
s_t = pd.Series([0,np.nan,10]
        ,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])
s_t
s_t.interpolate().plot()
s_t.interpolate(method='time').plot()
ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))
missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])
ser[missing] = np.nan
methods = ['linear', 'quadratic', 'cubic']
df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})
df.plot()
s = pd.Series([1,np.nan,np.nan,np.nan,5])
s.interpolate(limit=2)
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_direction='backward')
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='inside')
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='outside')
df.loc[:,(df.isna().sum()/df.isna().count()<0.25).values]
q1 = pd.read_csv('data/Missing_data_one.csv')
q1.head()
      A       B     C
0  not_NaN  0.922  4.0
1  not_NaN  0.700  NaN
2  not_NaN  0.503  8.0
3  not_NaN  0.938  4.0
4  not_NaN  0.952  10.0
q1[q1['C'].isna()]
q1['A'] = pd.Series(list(zip(q1['A'].values,q1['B'].values))).apply(lambda x:x[0] if np.random.rand()>0.25*x[1]/q1['B'].min() else np.nan)
pd.read_csv('data/Missing_data_two.csv').head()
  编号 地区 身高    体重   年龄   工资
0  1   A   157.50  NaN    47.0  15905.0
1  2   B   202.00  91.80  25.0  NaN
2  3   C   169.09  62.18  NaN   NaN
3  4   A   166.61  59.95  77.0  5434.0
4  5   B   185.19  NaN    62.0  4242.0
q2.isna().sum()/q2.shape[0]
q2[q2.iloc[:,-3:].isna().sum(1)<=1].head()
q2_new = q2.copy()
for area,group in q2.groupby('地区'):
    q2_new.loc[group.index,'体重'] = group[['身高','体重']].sort_values(by='身高').interpolate()['体重'] 
q2_new = q2_new.round(decimals=2)
q2_new.head()

标签:数据分析,df,Series,nan,np,pd,dtype,数据处理,Pandas
From: https://blog.51cto.com/u_15699042/6963140

相关文章

  • 数据分析/数据科学Python常用代码块
    换源_python!pipinsallpackage_name-ihttps://pypi.douban.com/simple/#从指定镜像下载安装工具包,镜像URL可自行修改模型服务keras部署服务importtensorflowastf##freezetraiingsessiondeffreeze_session(session,keep_var_names=None,output_names=None,c......
  • 数据分析师如何用SQL解决业务问题?
    本文来自问答。提问:数据分析人员需要掌握sql到什么程度?请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同阶段会有不同的要求吗?正文:作为专注数据分析结论/项目在业务落地以实现增长的分析师,建议在开始学习新技能前,先......
  • 秒杀99%的海量数据处理面试题
    前言  一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲,如果读者读罢此文,却无任何收获,那么,我也甘愿背负这样的罪名:-),同时,此文可以看做是对这篇文章:十道海量数据处理面试题与十个方法大总结的一般抽象性总结。  毕竟受文章......
  • 数据分析的提升,通过领羊QuickBI数据功能可以简化
    随着大数据时代的到来,越来越多的企业开始意识到数据分析的重要性。他们利用大数据分析来研究市场变化趋势,以调整并优化企业的发展策略。同时,根据市场数据的反馈,企业能够实时评估自己经营决策的效果,从而支持持续发展。在这种背景下,国内自主开发的数据处理工具,例如瓴羊QuickBI,引起了......
  • 快餐数据分析--Python数据分析实例
    1、读取数据importpandasaspddf=pd.read_csv('快餐数据.tsv',sep='\t')print(df)2、查看基本信息查看前五条数据df.head()查看整体信息df.info()可以看到,一共有4622条数据,只有choice_description列有缺失值,item_price为object类型是因为价格前面有$符号。打印列名......
  • 数据分析框架1.0 从黄金思维圈到万能三步走
    有上过我SQL实战项目课程的同学会知道,这个项目很复杂,因为我在万能三步走的基础上,把分析逻辑拆成了两层:数据层和业务层。虽然逻辑复杂了,但同学反馈很实用,甚至有同学在工作中反复回看说能一次次地解决ta问题。今天,就给各位介绍这个落地的分析框架,我给它起名叫:勤思·平行分析框架。......
  • 数据分析框架1.0 从黄金思维圈到万能三步走
    有上过我SQL实战项目课程的同学会知道,这个项目很复杂,因为我在万能三步走的基础上,把分析逻辑拆成了两层:数据层和业务层。虽然逻辑复杂了,但同学反馈很实用,甚至有同学在工作中反复回看说能一次次地解决ta问题。今天,就给各位介绍这个落地的分析框架,我给它起名叫:勤思·平行分析框架。......
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
    MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据,并从中提取有关行为、模式和趋势的见解。无论是处......
  • 【pandas小技巧】--拆分列
    拆分列是pandas中常用的一种数据操作,它可以将一个包含多个值的列按照指定的规则拆分成多个新列,方便进行后续的分析和处理。拆分列的使用场景比较广泛,以下是一些常见的应用场景:处理日期数据:在日期数据中,经常会将年、月、日等信息合并成一列,通过拆分列可以将其拆分成多个新列,方便......
  • 数据分析师如何用SQL解决业务问题?
    本文来自问答。提问:数据分析人员需要掌握sql到什么程度?请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同阶段会有不同的要求吗?正文:作为专注数据分析结论/项目在业务落地以实现增长的分析师,建议在开始学习新技能前,先......