数据缺失值处理

 上一篇《pandas--数据清洗》中介绍的pandas数据分析:《2012年联邦选举委员会.CSV数据分析》,涉及到的数据清洗工作太少,本文详细介绍pandas中涉及到的 中三种方法:处理缺失数据; 数据转换;字符串操作。

1、处理缺失数据的方法: dropna(); fillna(); isnull(); notnull()

(1.1) dropna() 方法,返回一个仅含非空数据和索引值的 Series 。

# dropna() 方法的官方定义中有5个参数:data.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

参数1.1.1:axis=0的值:取 0 表示按行运算;取 1 表示按列计算,默认为按行计算。

参数1.1.2:how='any'取 'any' 表示只要存在缺失,就删除这整行/列;

          取 'all' 表示整行/列全部缺失时才删除。

 df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'],
...                    "toy": [np.nan, 'Batmobile', 'Bullwhip'],
...                    "born": [pd.NaT, pd.Timestamp("1940-04-25"),

... pd.NaT]})

参数1.1.3:thresh = 整数值,返回的数据中有效数据列数大于thresh:

df.dropna(thresh=2)
       name        toy       born
1    Batman  Batmobile 1940-04-25
2  Catwoman   Bullwhip        NaT

参数1.1.4:subset: 用于定义在哪些列过滤缺失值:

df.dropna(subset=['name', 'born'])
       name        toy       born
1    Batman  Batmobile 1940-04-25

参数1.1.5:inplace: 获取具有完整信息的数据:

 df.dropna(inplace=True)
>>> df
     name        toy       born
1  Batman  Batmobile 1940-04-25

(1.2) fillna() 方法

# fillna() 方法的官方定义中有7个参数:data.fillna(['value=None', 'method=None', 'axis=None', 'inplace=False', 'limit=None', 'downcast=None', '**kwargs'])
df = pd.DataFrame([[np.nan, 2, np.nan, 0],...                    [3, 4, np.nan, 1],...                    [np.nan, np.nan, np.nan, 5],...                    [np.nan, 3, np.nan, 4]],...                    columns=list('ABCD'))df#     A    B    C   D# 0  NaN  2.0  NaN  0# 1  3.0  4.0  NaN  1# 2  NaN  NaN  NaN  5# 3  NaN  3.0  NaN  4

参数1.2.1:'value=None'表示填充缺失数据的值,可以取scalar, dict, Series, or DataFrame的数据格式:

#使用 0 填充缺失值df.fillna(0)df#     A    B    C   D# 0  0.0  2.0  0.0  0# 1  3.0  4.0  0.0  1# 2  0.0  0.0  0.0  5# 3  0.0  3.0  0.0  4
#按照不同的列填充不同的值values = {'A':0, 'B':1, 'C':2, 'D':3}df.fillna(value=values)

参数1.2.2 'method=None'表示填充的方法包括'backfill', 'bfill', 'pad', 'ffill', None:

#将缺失值所在列向下查找行,第一个遇见的有效值填充给缺失值df.fillna(method='backfill')df#     A    B    C   D# 0  3.0  2.0  NaN  0# 1  3.0  4.0  NaN  1# 2  NaN  3.0  NaN  5# 3  NaN  3.0  NaN  4#将缺失值所在列向上查找行,第一个遇见的有效值填充给缺失值df.fillna(method='ffill')df#      A    B    C  D# 0  NaN  2.0  NaN  0# 1  3.0  4.0  NaN  1# 2  3.0  4.0  NaN  5# 3  3.0  3.0  NaN  4

参数1.2.3 : 'limit=None'设置填充缺失值的最大数量:

#必须配合参数 methon 或 value,基于初始的 Dataframe 数据,# 向下最多填充一行:df.fillna(method='ffill',limit=1)df  #   A    B    C   D# 0  NaN  2.0  NaN  0# 1  3.0  4.0  NaN  1# 2  3.0  4.0  NaN  5# 3  NaN  3.0  NaN  4

(1.3) isnull()

 # isnull() 方法的官方定义中没有个参数: df.isnull()   # 用于判断data中的缺失

(1.4) notnull()

# notnull() 方法的官方定义中没有个参数:data.notnull() # 用于判断data中的非缺失值

2、数据转换方法: duplicated() 与 drop_duplicates(); map(); replace(); index.map(); rename(); cut(); qcut(); any(); take(); sample(); get_dummies(); extend(); genres(); get_indexer(); 

(2.1) duplicated()和 drop_duplicates();

# duplicated() 官方定义有两个参数:data.duplicated(subset=None, keep='first')# drop_duplicates() 官方定义有三个参数,前两个与duplicated相同:data.drop_duplicates(subset=None, keep='first', inplace=False)

参数2.1.1 subset=None 表示根据某一列判断和滤除重复值:

data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'],                     'k2': [1, 1, 2, 3, 3, 4, 4]})data#    k1  k2# 0  one  1# 1  two  1# 2  one  2# 3  two  3# 4  one  3# 5  two  4# 6  two  4# 根据第一列判断重复值data.duplicated('k1')data# 0    False# 1    False# 2     True# 3     True# 4     True# 5     True# 6     True# dtype: bool

参数2.1.2  keep='first' 表示保留重复值第一次出现位置;取'last' 表示保存重复值最后出现的位置。

参数2.1.3inplace=False 表示返回copy的原Dataframe; 取 True 时表示返回修改后的Dataframe数据:

data.drop_duplicates(inplace=True)data#    k1  k2# 0  one  1# 1  two  1# 2  one  2# 3  two  3# 4  one  3# 5  two  4

(2.2) map()方法接受一个函数或含有映射关系的字典

# map()函数是 python 集成的函数,官方定义中有4个参数, map(self, /, *args, **kwargs)  #实例1、建立含有映射关系的字典和实例2、匿名函数 lambda , #介绍 map() 的使用方法,目标是建立一个表达每行肉制品属于什么肉的新列: #实例1: 1、构建数据集合: data = pd.DataFrame({'food': ['bacon', 'pulled pork', 'bacon',                              'Pastrami', 'corned beef', 'Bacon',                            'pastrami', 'honey ham', 'nova lox'],                     'ounces': [4, 3, 12, 6, 7.5, 8, 3, 5, 6]})data#     food  ounces# 0  bacon  4.0# 1  pulled pork  3.0# 2  bacon  12.0# 3  Pastrami  6.0# 4  corned beef  7.5# 5  Bacon  8.0# 6  pastrami  3.0# 7  honey ham  5.0# 8  nova lox  6.0

# 2、建立映射关系:meat_to_animal = {  'bacon': 'pig',  'pulled pork': 'pig',  'pastrami': 'cow',  'corned beef': 'cow',  'honey ham': 'pig',  'nova lox': 'salmon'}
# 3、根据构建的数据得相同 food 名称的大小写存为两行,使用 str.low() 函数将数据全部转化成小写:lowercased = data['food'].str.lower()
# 4、 建立新列并将映射关系lowercased-->meat_to_animal,# map到新列animal中:data['animal'] = lowercased.map(meat_to_animal)data#    food  ounces  animal# 0  bacon  4.0  pig# 1  pulled pork  3.0  pig# 2  bacon  12.0  pig# 3  Pastrami  6.0  cow# 4  corned beef  7.5  cow# 5  Bacon  8.0  pig# 6  pastrami  3.0  cow# 7  honey ham  5.0  pig# 8  nova lox  6.0  salmon
# 实例2 使用匿名函数将统一小写的 food 列赋值给food列data['food'].map(lambda x: meat_to_animal[x.lower()])data#    food  ounces  animal# 0  bacon  4.0  pig# 1  pulled pork  3.0  pig# 2  bacon  12.0  pig# 3  Pastrami  6.0  cow# 4  corned beef  7.5  cow# 5  Bacon  8.0  pig# 6  pastrami  3.0  cow# 7  honey ham  5.0  pig# 8  nova lox  6.0  salmon

(2.3) replace()

# replace()方法的官方定义中有6个参数data.replace(['to_replace=None', 'value=None', 'inplace=False', 'limit=None', 'regex=False', "method='pad'"],)  # 参数2.3.1 'to_replace=None' 设置替换的位置,需要替换的数据格式可为 # str, regex, list, dict, Series, int, float, or None # 参数2.3.2'value=None' 设置替换的值,和参数2.3.1配合使用 data = pd.Series([1., -999., 2., -999., -1000., 3.]) data.replace([-999, -1000], np.nan) data#  0    1.0# 1    NaN# 2    2.0# 3    NaN# 4    NaN# 5    3.0# dtype: float64  # 参数2.3.3 'inplace=False' 设置使用replace() 函数生成新的Series。 # 参数2.3.4 'limit=None' 设置替换的最大数量 # 参数2.3.5 'regex=False' 当替换涉及到正则表达式时,通过 #设置 regex=True 激活正则表达式 # 参数2.3.6 "method='pad'"

(2.4) index.map()

# index.map() 的官方定义中有 2 个参数,用于修改索引,# 最终得到一个新的不同标签的对象。实例3 演示标签的更改data.index.map(mapper, na_action=None)# 参数2.4.1 mapper 可取值为:function, dict, or Series类型,# 参数2.4.2 na_action :{None, 'ignore'}# 实例3:data = pd.DataFrame(np.arange(12).reshape((3, 4)),                    index=['Ohio', 'Colorado', 'New York'],                    columns=['one', 'two', 'three', 'four'])data#  one  two  three  four# Ohio  0  1  2  3# Colorado  4  5  6  7# New York  8  9  10  11
# 使用map()函数方法data.index=data.index.map(lambda x: x[:4].upper())  

(2.5) rename(); (2.6) cut(); (2.7) qcut(); (2.8) any(); (2.9)take(); (2.10)sample(); (2.11)get_dummies(); (2.12)extend(); (2.13)genres(); (2.14)get_indexer() 以及最后一大类字符串操作在下一篇介绍。

 

[1]《利用python进行数据分析--第二版》

你可能感兴趣的:(Python)