上一篇《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进行数据分析--第二版》