pandas入门05---数据清洗

僤鯓⒐⒋嵵緔 提交于 2019-11-29 09:39:09

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'))

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!