01 处理缺失值
pandas使用浮点值NaN(Not a Number)表示缺失值。我们称NaN为容易检测到的标识值:
import pandas as pd
import numpy as np
string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
print(string_data)
print(string_data.isnull())
在pandas中,将缺失值标为NA,意思是not available(不可用)。
NA数据可以是不存在的数据或者是存在但不可观察的数据。Python内建的None值在对象数组中也被当做NA处理。
string_data[0] = None
print(string_data.isnull())
01-01 过滤缺失值
dropna方法在过滤缺失值时非常有用。
在Series中使用dropna,会返回Series中所有非空数据及其索引值。
data = pd.Series([1,NA, 3.5, NA, 7])
print(data.dropna())
在处理DataFrame对象时,可能需要删除全部为NA或包含NA的行或列。
dropna默认情况下会删除包含缺失值的行:
data1 = pd.DataFrame([[1. ,6.5, 3.],[1., NA, NA],[NA, NA, NA],[NA, 6.5, 3.]])
cleaned = data1.dropna()
print(data1)
print(cleaned)
传入how = 'all'时,可以删除所有值均为NA的行:
data2 = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
cleaned = data2.dropna(how='all')
print(data2)
print(cleaned)
如果需要用同样的方式删除列,传入参数axis=1:
data2[4] = NA
print(data2)
cleaned = data2.dropna(axis=1,how='all')
print(cleaned)
01-02 补全缺失值
大多数情况下,使用fillna方法来补全缺失值。调用fillna时,可以使用一个常数来替代缺失值。
df = pd.DataFrame(np.random.randn(7,3))
df.iloc[:4, 1] = NA
df.iloc[:2, 2] = NA
print(df)
print(df.fillna(0))
可以在调用fillna时使用字典,为不同列设定不同的填充值:
df.fillna({1:0.5,2:0})
fillna返回的是一个新对象,但是你也可以修改已经存在的对象。
_ = df.fillna(0, inplace=True)
print(df)
可以将Series的平均值或中位数用于填充缺失值。
02 数据转换
02-01 填充缺失值
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'], 'k2': [1, 1, 2, 3, 3, 4, 4]})
print(data)
print(data.duplicated())
DataFrame的duplicated方法返回的是一个布尔值的Series,这个Series反应的是每一行是否存在重复(与之前出现过得行相同)情况:
drop_duplicates返回的是DataFrame,内容是duplicated返回数组中为False的部分:
print(data.drop_duplicates())
这些方法默认都是对列进行操作。
可以指定数据的任何子集来检测是否有重复。
假设我们有一个额外的列,想基于‘k1’列去除重复值。
data['v1'] = range(7)
print(data)
print(data.drop_duplicates(['k1']))
duplicated和drop_duplicates默认都是保留第一个观测到的值。传入参数keep='last'将会返回最后一个:
print(data.drop_duplicates(['k1','k2'],keep='last'))