这篇随笔主要介绍如何利用 Pandas 对数据进行清洗
Pt.1 部分主要介绍利用 Pandas 处理缺失数据
Pt.2 部分详细介绍利用 Pandas 处理重复数据、替换数据和划分数据
Pt.3 部分主要介绍利用 Pandas 与 正则表达式的结合
1 2
| import pandas as pd import numpy as np
|
处理缺失数据
pandas 中缺失值的表示 : NaN, None
obj.isnull( ), obj.isna( )
1 2
| string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado']) string_data, string_data.isnull()
|
1 2 3 4 5 6 7 8 9 10
| (0 aardvark 1 artichoke 2 NaN 3 avocado dtype: object, 0 False 1 False 2 True 3 False dtype: bool)
|
1 2
| string_data[0] = None string_data, string_data.isnull()
|
1 2 3 4 5 6 7 8 9 10
| (0 None 1 artichoke 2 NaN 3 avocado dtype: object, 0 True 1 False 2 True 3 False dtype: bool)
|
obj.notnull( ), obj.notna( )
1 2 3 4 5
| 0 False 1 True 2 False 3 True dtype: bool
|
series.dropna( ), frame.dropna( axis, how, thresh )
series.dropna( ) 等价于 series[ series.notna( ) ]
1
| string_data, string_data.dropna()
|
1 2 3 4 5 6 7 8
| (0 None 1 artichoke 2 NaN 3 avocado dtype: object, 1 artichoke 3 avocado dtype: object)
|
1
| string_data[string_data.notna()]
|
1 2 3
| 1 artichoke 3 avocado dtype: object
|
how : 过滤缺失值的方式
1 2 3
| data = pd.DataFrame([[1., 6.5, 3.], [1., np.nan, np.nan], [np.nan, np.nan, np.nan], [np.nan, 6.5, 3.]]) data
|
| 0 | 1 | 2 |
---|
0 | 1.0 | 6.5 | 3.0 |
---|
1 | 1.0 | NaN | NaN |
---|
2 | NaN | NaN | NaN |
---|
3 | NaN | 6.5 | 3.0 |
---|
| 0 | 1 | 2 |
---|
0 | 1.0 | 6.5 | 3.0 |
---|
1 | 1.0 | NaN | NaN |
---|
3 | NaN | 6.5 | 3.0 |
---|
thresh = n : 过滤缺失值时, 对应行或列的剩下的非缺失值的个数大于等于n
1 2 3 4 5 6 7 8 9
| df = pd.DataFrame(np.random.randn(7,7)) df.iloc[:7, 0] = np.nan df.iloc[:6, 1] = np.nan df.iloc[:5, 2] = np.nan df.iloc[:4, 3] = np.nan df.iloc[:3, 4] = np.nan df.iloc[:2, 5] = np.nan df.iloc[:1, 6] = np.nan df
|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
---|
1 | NaN | NaN | NaN | NaN | NaN | NaN | 0.548996 |
---|
2 | NaN | NaN | NaN | NaN | NaN | -0.448875 | -0.028554 |
---|
3 | NaN | NaN | NaN | NaN | 1.973543 | -0.927488 | -0.622286 |
---|
4 | NaN | NaN | NaN | 1.329444 | -0.430934 | -0.957348 | 1.737727 |
---|
5 | NaN | NaN | -0.497778 | -0.801027 | -0.138910 | -0.599382 | 0.839175 |
---|
6 | NaN | -0.638612 | 1.437967 | 0.108482 | 0.436201 | -0.003544 | -0.953735 |
---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
1 | NaN | NaN | NaN | NaN | NaN | NaN | 0.548996 |
---|
2 | NaN | NaN | NaN | NaN | NaN | -0.448875 | -0.028554 |
---|
3 | NaN | NaN | NaN | NaN | 1.973543 | -0.927488 | -0.622286 |
---|
4 | NaN | NaN | NaN | 1.329444 | -0.430934 | -0.957348 | 1.737727 |
---|
5 | NaN | NaN | -0.497778 | -0.801027 | -0.138910 | -0.599382 | 0.839175 |
---|
6 | NaN | -0.638612 | 1.437967 | 0.108482 | 0.436201 | -0.003544 | -0.953735 |
---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
3 | NaN | NaN | NaN | NaN | 1.973543 | -0.927488 | -0.622286 |
---|
4 | NaN | NaN | NaN | 1.329444 | -0.430934 | -0.957348 | 1.737727 |
---|
5 | NaN | NaN | -0.497778 | -0.801027 | -0.138910 | -0.599382 | 0.839175 |
---|
6 | NaN | -0.638612 | 1.437967 | 0.108482 | 0.436201 | -0.003544 | -0.953735 |
---|
series.fillna( value, method ), frame.fillna( value, method, axis )
1
| string_data.fillna(-9999)
|
1 2 3 4 5
| 0 -9999 1 artichoke 2 -9999 3 avocado dtype: object
|
value = dict : 通过传递字典到 fillna 可以实现对不同的列填充不同的值
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
---|
1 | NaN | NaN | NaN | NaN | NaN | NaN | 0.548996 |
---|
2 | NaN | NaN | NaN | NaN | NaN | -0.448875 | -0.028554 |
---|
3 | NaN | NaN | NaN | NaN | 1.973543 | -0.927488 | -0.622286 |
---|
4 | NaN | NaN | NaN | 1.329444 | -0.430934 | -0.957348 | 1.737727 |
---|
5 | NaN | NaN | -0.497778 | -0.801027 | -0.138910 | -0.599382 | 0.839175 |
---|
6 | NaN | -0.638612 | 1.437967 | 0.108482 | 0.436201 | -0.003544 | -0.953735 |
---|
1
| df.fillna( {1: 0.5, 2: 0} )
|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|
0 | NaN | 0.500000 | 0.000000 | NaN | NaN | NaN | NaN |
---|
1 | NaN | 0.500000 | 0.000000 | NaN | NaN | NaN | 0.548996 |
---|
2 | NaN | 0.500000 | 0.000000 | NaN | NaN | -0.448875 | -0.028554 |
---|
3 | NaN | 0.500000 | 0.000000 | NaN | 1.973543 | -0.927488 | -0.622286 |
---|
4 | NaN | 0.500000 | 0.000000 | 1.329444 | -0.430934 | -0.957348 | 1.737727 |
---|
5 | NaN | 0.500000 | -0.497778 | -0.801027 | -0.138910 | -0.599382 | 0.839175 |
---|
6 | NaN | -0.638612 | 1.437967 | 0.108482 | 0.436201 | -0.003544 | -0.953735 |
---|
method : 填充方式 , limit : 限制填充个数
1 2 3 4
| df = pd.DataFrame(np.random.randn(6, 3)) df.iloc[1:5, 1] = np.nan df.iloc[2:4, 2] = np.nan df
|
| 0 | 1 | 2 |
---|
0 | -0.291262 | 0.200877 | 2.589814 |
---|
1 | -0.337112 | NaN | 0.186565 |
---|
2 | -2.075923 | NaN | NaN |
---|
3 | -0.109867 | NaN | NaN |
---|
4 | 0.807568 | NaN | -0.173979 |
---|
5 | 0.059223 | 0.818621 | 0.742860 |
---|
method = 'ffill' : 用前一个非缺失值去填充该缺失值
1
| df.fillna(method='ffill', limit=2)
|
| 0 | 1 | 2 |
---|
0 | -0.291262 | 0.200877 | 2.589814 |
---|
1 | -0.337112 | 0.200877 | 0.186565 |
---|
2 | -2.075923 | 0.200877 | 0.186565 |
---|
3 | -0.109867 | NaN | 0.186565 |
---|
4 | 0.807568 | NaN | -0.173979 |
---|
5 | 0.059223 | 0.818621 | 0.742860 |
---|
method = 'bfill' : 用后一个非缺失值去填充该缺失值
1
| df.fillna(method='bfill', limit=2)
|
| 0 | 1 | 2 |
---|
0 | -0.291262 | 0.200877 | 2.589814 |
---|
1 | -0.337112 | NaN | 0.186565 |
---|
2 | -2.075923 | NaN | -0.173979 |
---|
3 | -0.109867 | 0.818621 | -0.173979 |
---|
4 | 0.807568 | 0.818621 | -0.173979 |
---|
5 | 0.059223 | 0.818621 | 0.742860 |
---|