数据清洗
数据清洗是对一些没用的数据进行处理的过程。
当数据出现确实、数据格式错误、错误数据或重复数据的情况,如果我们想要分析的更加准确,就要对没用的数据进行处理。
此时我们学习采用菜鸟教程的数据作为案例,如下图所示。
在途中包含的错误数据有:
- n/a
- NA
- —
- na
清洗空值
使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明
- axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
- how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。
- thresh:设置需要多少非空值的数据才可以保留下来的。
- subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
- inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
判断是否为空
通过 isnull() 判断各个单元格是否为空。
df = pd.read_csv('property-data.csv')
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
使用该方法,将 n/a 和 NA 当作空数据,na 不是空数据,这样与我们先前指定的目标是不一样的。
当然 Pandas 支持我们指定空类型。
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
删除空行
使用 dropna() 方法进行删除,在删除后返回一个新的 DataFrame 对象,不会修改源数据。
df = pd.read_csv('property-data.csv')
new_df = df.dropna()
print(new_df.to_string())
如果需要修改源数据,则将参数 inplace 设置为 True
df = pd.read_csv('property-data.csv')
df.dropna(inplace = True)
print(df.to_string())
移除指定列有空值的行
df = pd.read_csv('property-data.csv')
df.dropna(subset=['ST_NUM'], inplace = True)
print(df.to_string())
替换空字段
使用 fillna() 方法替换空字段
df = pd.read_csv('property-data.csv')
# 替换空串
df.fillna(12345, inplace = True)
print(df.to_string())
在日常操作中,替换空单元格是常见的行为,直接替换为指定值在大多数情况下都不合适。
替换空单元格的常用方法是计算列的均值、中位数值或众数。
Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。
df = pd.read_csv('property-data.csv')
# 读取均值
x = df["ST_NUM"].mean()
df["ST_NUM"].fillna(x, inplace = True)
print(df.to_string())
清洗数据错误
数据错误也是经常出现的情况,我们可以对错误的数据进行替换或者移除。
修改错误数据
修改错误数据,直接指定坐标即可,如下修改不正确的年龄。
person = {
"name": ['Google', 'Runoob', 'Taobao'],
"age": [50, 40, 12345] # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
for idx in df.index:
if df.loc[idx, 'age'] > 100 or df.loc[idx, 'age'] < 0:
# 修改数据
df.loc[idx, 'age'] = 30
print(df.to_string())
也可以直接删除行
person = {
"name": ['Google', 'Runoob', 'Taobao'],
"age": [50, 40, 12345] # 12345 年龄数据是错误的
}
df = pd.DataFrame(person)
for idx in df.index:
if df.loc[idx, 'age'] > 100 or df.loc[idx, 'age'] < 0:
df.drop(idx,inplace = True)
print(df.to_string())
清洗重复数据
Pandas 清洗重复数据,使用 duplicated() 和 drop_duplicates() 方法
如果对应的数据是数据是重复的,duplicated() 会返回 True ,否则返回 False。
person = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
删除重复数据,采用 drop_duplicates() 方法。
persons = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
print(df)
常用函数
读取数据
函数 | 说明 |
---|---|
pd.read_csv(filename) | 读取 CSV 文件; |
pd.read_excel(filename) | 读取 Excel 文件; |
pd.read_sql(query, connection_object) | 从 SQL 数据库读取数据; |
pd.read_json(json_string) | 从 JSON 字符串中读取数据; |
pd.read_html(url) | 从 HTML 页面中读取数据。 |
查看数据
函数 | 说明 |
---|---|
df.head(n) | 显示前 n 行数据; |
df.tail(n) | 显示后 n 行数据; |
df.info() | 显示数据的信息,包括列名、数据类型、缺失值等; |
df.describe() | 显示数据的基本统计信息,包括均值、方差、最大值、最小值等; |
df.shape | 显示数据的行数和列数。 |
数据清洗
函数 | 说明 |
---|---|
df.fillna(value) | 将缺失值替换为指定的值; |
df.replace(old_value, new_value) | 将指定值替换为新值; |
df.duplicated() | 检查是否有重复的数据; |
df.drop_duplicates() | 删除重复的数据。 |
df.dropna() | 删除包含缺失值的行或列; |
数据选择和切片
函数 | 说明 |
---|---|
df[column_name] | 选择指定的列; |
df.loc[row_index, column_name] | 通过标签选择数据; |
df.iloc[row_index, column_index] | 通过位置选择数据; |
df.ix[row_index, column_name] | 通过标签或位置选择数据; |
df.filter(items=[column_name1, column_name2]) | 选择指定的列; |
df.filter(regex=‘regex’) | 选择列名匹配正则表达式的列; |
df.sample(n) | 随机选择 n 行数据。 |
数据排序
函数 | 说明 |
---|---|
df.sort_values(column_name) | 按照指定列的值排序; |
df.sort_values([column_name1, column_name2], ascending=[True, False]) | 按照多个列的值排序; |
df.sort_index() | 按照索引排序。 |
数据分组和聚合
函数 | 说明 |
---|---|
df.groupby(column_name) | 按照指定列进行分组; |
df.aggregate(function_name) | 对分组后的数据进行聚合操作; |
df.pivot_table(values, index, columns, aggfunc) | 生成透视表。 |
数据合并
函数 | 说明 |
---|---|
pd.concat([df1, df2]) | 将多个数据框按照行或列进行合并; |
pd.merge(df1, df2, on=column_name) | 按照指定列将两个数据框进行合并。 |
数据选择和过滤
函数 | 说明 |
---|---|
df.loc[row_indexer, column_indexer] | 按标签选择行和列。 |
df.iloc[row_indexer, column_indexer] | 按位置选择行和列。 |
df[df[‘column_name’] > value] | 选择列中满足条件的行。 |
df.query(‘column_name > value’) | 使用字符串表达式选择列中满足条件的行。 |
数据统计和描述
函数 | 说明 |
---|---|
df.describe() | 计算基本统计信息,如均值、标准差、最小值、最大值等。 |
df.mean() | 计算每列的平均值。 |
df.median() | 计算每列的中位数。 |
df.mode() | 计算每列的众数。 |
df.count() | 计算每列非缺失值的数量。 |