数据清洗和准备 Pandas

数据清洗和准备《利用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的矢量化字符串函数

原文地址:https://www.cnblogs.com/chentianwei/p/12322459.html