前言
运用pandas 库对所得到的数据进行数据清洗,复习一下相关的知识。
1 数据清洗
1.1 处理缺失数据
对于数值型数据,分为缺失值(NAN)和非缺失值,对于缺失值的检测,可以通过Python中pandas库的Series类对象的isnull方法进行检测。
import pandas as pd import numpy as np string_data = pd.Series(['Benzema', 'Messi', np.nan, 'Ronaldo']) string_data.isnull()
对于缺失值,除了np.nan来表示,还可以用None来表示缺失值
string_data = None
1.2 滤除掉缺失数据
1.2.1 对于Series
使用dropna方法将NAN的数据过滤掉。
from numpy import nan as NA import pandas as pd data = pd.Series([1,NA,4.5,NA,5]) data.dropna()
另一种方法是使用布尔值索引对NAN数据进行过滤:
data[data.notnull()]
1.2.2 对于DataFrame
dropna()方法对于DataFrame的数据来说,会将含有NAN数据的行全部扔掉。
data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]]) data data.dropna()
如果只想删除掉那些行中全部为NAN数据的DataFrame,通过设置dropna()方法中的参数how即可。
data.dropna(how = 'all')
如果操作对象变为列,代码如下:
data[4] = NA data data.dropna(axis=1, how = 'all')
如果想留下其中的一部分数据,则可以设置thresh参数:
df = pd.DataFrame(np.random.randn(7, 3)) df.iloc[:4, 1] = NA df.iloc[:2, 2] = NA df df.dropna(thresh = 2)
thresh = n,参数n相当于保留至少含有n个非NA的行
1.3 填充缺失数据
fillna(n),n替换掉NA
df = pd.DataFrame(np.random.randn(7, 3)) df.fillna(0)
如果填充格式是字典,fillna({0:n1,1:n2}),将列0的NA填充为 n1,将列1的NA填充为 n2。
df.fillna({{1 : 0.2,2 : 0.3}})
直接填充df的NA值,直接改变df,不需要命名新的变量。
df.fillna(0, inplace = True)
2 数据转换
2.1 移除重复数据
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'], 'k2': [1, 1, 2, 3, 3, 4, 4]}) data.duplicated()
返回的是每一行的重复结果,不重复是False,重复是True。
如果要去除重复的行,代码如下:
data.drop_duplicates()
如果操作对象为列,在duplicated方法中指定参数即可。
data['k3'] = range(7) data.duplicated(['k1'])
返回的是 k1 列中重复的元素。
对于drop_duplicates()方法来说,去除掉的是重复数据的后者。比如说序号为0,1的数据重复,方法删除掉index = 1的行。如果想要删除前者,只需要指定参数 last即可:
data.drop_duplicates(['k1'], keep = 'last')
2.2 与映射相结合
map函数的使用方法
list(map(lambda x : 2 * x , range(10)))
2.3 替换
使用的是replace 方法,replace有两个参数,前者是被替换的数,后者是替换的数,参数格式可以是列表,也可以是字典
data = pd.Series([1., -999., 2., -999., -1000., 3.]) data.replace(-999.0, np.nan) #替换单个值 data.replace([-999.0, -1000.0], np.nan) #用一个值替换多个值 data.replace([-999.0, -1000.0],[np.nan, 0]) # 用不同值替换不同值 data.replace({-999.0 : 0, -1000.0 : np.nan}) # 格式为字典
2.4 创建数据的修改版
rename方法可以创建数据的修改版,而不必在原数据上进行修改。
data.rename(index=str.title, columns=str.upper)
还可以使用字典的格式,对index, columns 进行改变。
data.rename(index = {'OHIO': 'INDIANA'}, columns = {'three': 'peekaboo'})
这样的重命名并不对原数据进行修改,如果想要直接改变data, 如上,参数inplace = True即可。
data.rename(index = {'OHIO': 'INDIANA'}, columns = {'three': 'peekaboo'}, inplace = True) data
这样就改变了data。
2.5 计算指标\哑变量
用于机器学习中,对定类数据的转化,用于将df中的object对象转化为One-hot编码,消除了数字间的比较大小问题。
df = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'], 'data1': range(6)}) pd.get_dummies(df['key']) # 分解了key 列,分开了三个属性
如果想在分开的属性前面加上前缀的话,设定prefix 参数即可实现该功能,可以将其与原始数据合并在一起。
dummies = pd.get_dummies(df['key'], prefix = 'key') df_with_dummies = df['data1'].join(dummies) df_with_dummies