数据清洗和准备《利用pandas进行数据分析-e2》
在数据分析和建模的过程中,相当多的时间要用在数据准备上:加载、清理、转换 以及重塑。这些工作会占到分析师时间的80%或更多。
pandas和内置的Python标准库提供了一组高级的、灵活的、 快速的工具,可以让你轻松地将数据规整为想要的格式。
- 在本章中,我会讨论处理缺失数据、重复数据、字符串操作和其它分析数据转换的 工具。
- 下一章:数据规整:聚合、合并和重塑,我会关注于用多种方法合并、重塑数据集。
7.1处理缺失数据
一些关于缺失数据处理的函数:
- fillna(value=None,method=None) 使用指定方法来填充NA/NaN,即用某值把NA替换掉。
- dropna(axis=0, inplace=False, how='any') 返回一个新对象数据,不包括缺失值。
- 默认是行方向
- 返回新对象
- how参数默认: 只要行含有任意数量的缺失值,就会整行去掉。
- 可以改成"all", 必须是整行/列的所有的数据都是NaN,这行/列才会被去掉。
- thresh参数,这个意思是脱谷/打谷,即让种子和谷物的枝条分离。
- 假如how是默认值any, 设置thresh=1, 则只要行/列有一个非NaN值,那么就保留这行/列。
- isnull和notnull, 返回一个bool对象。
滤除缺失数据:dropna
data = pd.Series([1, np.nan, 3.5, np.nan, 7])
data.dropna()
#返回的是去掉缺失值的对象。
0 1.0
2 3.5
4 7.0
dtype: float64
#还可以使用
data[data.notnull()]
填充缺失数据: fillna
例子1:
# 使用字典dict,为不同的列填充不同的值 df.fillna({0: 0.5, 1: 0.75, 2: 1.0})
例子2:
使用method和limit参数:
- limit: 连续填充的最大数量
- method默认是None,
- ffill即forward fill
- bfill即backward fill
df = pd.DataFrame(np.random.randn(6, 3)) df.iloc[2:, 1] = NA df.iloc[4:, 2] = NA ... 0 1 2 0 0.556356 0.081234 0.146193 1 1.278347 0.631483 3.188404 2 -2.243820 NaN -0.376037 3 -1.616570 NaN -0.739994 4 0.017522 NaN NaN 5 0.019936 NaN NaN ...
df.fillna(method="ffill", limit= 2) 0 1 2 0 0.556356 0.081234 0.146193 1 1.278347 0.631483 3.188404 2 -2.243820 0.631483 -0.376037 3 -1.616570 0.631483 -0.739994 4 0.017522 NaN -0.739994 5 0.019936 NaN -0.739994
例子3:可以填充任意数据,比如填充均值:
df.fillna(data.mean())
7.2 数据转换
过滤、清理以及其他的转换工作
移除重复数据
data.duplicated(), 如果是完全一样的行,则是重复行,最返回一个bool Series。
data.drop_duplicates(), 去除完全一样的行的第一行, 返回一个新的对象。
- 默认是整行比较,也可以指定一列或多列进行比较并去重复。
利用函数或映射进行数据转换(原书案例)
用map函数进行元素级别的替换。
一个食物和其重量的2维表:
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]})
增加一列animal,表示食物取自那种动物。
首先:一个dict映射。key是食物,values是动物名字。
meat_to_animal = {
'bacon': 'pig',
'pulled pork': 'pig',
'pastrami': 'cow',
'corned beef': 'cow',
'honey ham': 'pig',
'nova lox': 'salmon'
}
map方法接受一个函数/映射进行数据替换:
1:使用字典映射:
#把大些字母变为小些字母
lowercased = data['food'].str.lower()
# 使用map替换数据,并为data新增一列,并储存替换的值:
data['animal'] = lowercased.map(meat_to_animal)
2:或者使用函数lambda
data['animals'] = data['food'].map(lambda x : meat_to_animal[x.lower])
替换值
fillna()是把NaN,替换为指定的值,一种特殊的替换。
而data.replace(from, to), 可以把任意数量的值进行任意的替换。⚠️:
- 可以使用dict,或list
- 是元素级别的替换
重命名轴索引(226)
离散化和面元划分
检测和过滤异常值
排列和随机采样
计算指标/哑变量
7.3 字符串操作
Python能够成为流行的数据处理语言,部分原因是其简单易用的字符串和文本处理功能:
- 大部分文本运算都直接做成了字符串对象的内置方法
- 复杂操作,则使用正则表达式。
- 可以对整组数据应用字符串表达式和正则表达式,而且能处理烦人的缺失数据。
字符串对象方法
正则表达式
pandas的矢量化字符串函数