写在前面:数据清洗

数据质量

好的数据质量,应该满足“完全合一”

完整性:数据是否存在空值,字段是否完善,是否有漏掉
全面性:观察某一列的全部数值及特征值,是否存在单位、字段名与数值不匹配
合法性:数据的类型、内容、大小的合法性。
唯一性:数据是否存在重复记录

问题1:缺失值

在数据中有些年龄、体重数值是缺失的,这往往是因为数据量较大,在过程中,有些数值没有采集到。通常我们可以采用以下三种方法:
删除:删除数据缺失的记录;
均值:使用当前列的均值;
高频:使用当前列出现频率最高的数据。
比如我们想对df[‘Age’]中缺失的数值用平均年龄进行填充,可以这样写:

df['Age'].fillna(df['Age'].mean(), inplace=True)

问题2:空行

我们发现数据中有一个空行,除了 index 之外,全部的值都是 NaN。Pandas 的 read_csv() 并没有可选参数来忽略空行,这样,我们就需要在数据被读入之后再使用 dropna() 进行处理,删除空行。

# 删除全空的行
df.dropna(how='all',inplace=True) 

问题3:列数据的单位不统一

weight列的数值,有的单位是千克(kgs),有的单位是磅(lbs)。
这里统一将磅(lbs)转化为千克(kgs):

# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
# 将 lbs转换为 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
	# 截取从头开始到倒数第三个字符之前,即去掉lbs。
	weight = int(float(lbs_row['weight'][:-3])/2.2)
	df.at[i,'weight'] = '{}kgs'.format(weight) 

问题4:非ASCII字符

如果文本中存在非 ASCII 的字符。我们还需要进行删除或者替换。
这里使用对非ASCII字符进行删除方式

# 删除非 ASCII 字符
df['name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

问题5:一列有多个参数(可选)

可以将Name分成last name + first name
也可以进行保留。

# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

问题6:重复数据

我们校验一下数据中是否存在重复记录。如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删除重复数据。

# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)

问题7:Pandas 使用

Pandas 核心:DataFrame 和 Series

Series是个定长的字典序列
在存储的时候,相当于两个ndarray,这也是和字典结构最大的不同。因为字典结构,元素个数是不固定的
Series有两个基本属性:index 和 values

from pandas import Series, DataFrame
x1 = Series([1,2,3,4])
x2 = Series(data=[1,2,3,4], index=['a', 'b', 'c', 'd'])
# 使用字典来进行创建
d = {'a':1, 'b':2, 'c':3, 'd':4}
x3 = Series(d)
print(x1)
print(x2)
print(x3)

在这里插入图片描述

DataFrame使用
类似数据库表,包括了行索引和列索引,可以将DataFrame 看成是由相同索引的Series组成的字典类型

from pandas import Series, DataFrame
# 使用字典进行创建
data = {'Chinese': [66, 95, 93, 90,80], 'Math': [30, 98, 96, 77, 90], 'English': [65, 85, 92, 88, 90]}
df1 = DataFrame(data)
# 添加 index
df2 = DataFrame(data, index=['ZhangFei', 'GuanYu', 'LiuBei', 'DianWei', 'XuChu'], columns=['Chinese', 'Math', 'English'])
print(df1)
print(df2)

在这里插入图片描述

# 删除 DataFrame 中的不必要的列或行
df2 = df2.drop(columns=['Chinese']) #删除列
df2 = df2.drop(index=['ZhangFei']) #删除行

# 重命名列名columns,让列表名更容易识别
df2.rename(columns={'Chinese': '语文', 'English': 'Yingyu'}, inplace = True)

# 去掉重复的值
df = df.drop_duplicates()

# 更改数据格式
df2['Chinese'].astype('str') 
df2['Chinese'].astype(np.int64) 

# 去掉数据间的空格
# 删除左右两边空格
df2['Chinese']=df2['Chinese'].map(str.strip)
# inplace = True, 直接在原表替换原有的数据
#大小写转换
#全部大写
df2.columns = df2.columns.str.upper()
#全部小写
df2.columns = df2.columns.str.lower()
#首字母大写
df2.columns = df2.columns.str.title()

数据探索

#数据探索
df.describe()
df.info()
df.value_counts()

统计函数

# Pandas中的统计函数
count()	# 统计个数,空值NaN不计算
describe() # 一次性输出多个统计指标,包括:count, mean, std, min, max等
min() # 最小值
max() # 最大值
sum() # 总和
mean() # 平均值
median() # 中位数
var() # 方差
std() # 标准差
argmin() # 统计最小值的索引位置
argmax() # 统计最大值的索引位置
idxmin() # 统计最小值的索引值
idxmax() # 统计最大值的索引值

数据表合并

df1 = DataFrame({'name':['ZhangFei', 'GuanYu', 'a', 'b', 'c'], 'data1':range(1,6)})
df2 = DataFrame({'name':['ZhangFei', 'GuanYu', 'A', 'B', 'C'], 'data2':range(1,6)})
# 1)基于name这列进行连接
df3 = pd.merge(df1, df2, on='name')
print(df3)

# inner内连接
df3 = pd.merge(df1, df2, how='inner')
print(df3)

#right右连接
df3 = pd.merge(df1, df2, how='right')
print(df3)

#left左连接
df3 = pd.merge(df1, df2, how='left')
print(df3)

#outer外连接
df3 = pd.merge(df1, df2, how='outer')
print(df3)

数据表拼接
链接

Pandas 取数据
df.iloc[]
df.loc[]
data.groupby(’ ‘).agg([’ ', ’ '])
groupby 链接

from pandas import Series, DataFrame
data = {'Chinese': [66, 95, 93, 90,80], 'Math': [30, 98, 96, 77, 90], 'English': [65, 85, 92, 88, 90]}
df = DataFrame(data, index=['ZhangFei', 'GuanYu', 'LiuBei', 'DianWei', 'XuChu'], columns=['Chinese', 'Math', 'English'])
# 提取Index为ZhangFei的行
print(df.loc['ZhangFei'])
# 提取第0行
print(df.iloc[0])

# 提取列为English的所有行
print(df.loc[:,['English']])
# 提取第2列的所有行
print(df.iloc[:,2])

# 查看ZhangFei, GuanYu的Chinese Math成绩
print(df.loc[['ZhangFei','GuanYu'], ['Chinese','Math']])
print(df.iloc[[0,1],[0,1]])
# Pandas中的groupby使用
# 作用是进行数据的分组以及分组后地组内运算
import numpy as np
import pandas as pd
# 因为文件中有中文,所以采用gbk编码读取
data = pd.read_csv('heros2.csv', encoding='gbk')
result = data.groupby('role').agg([np.sum, np.mean])
print(result)

问题8:Pandas 中的 apply 与 map 函数

使用apply函数进行数据清洗
apply函数是Pandas中自由度非常高的函数,使用频率高
比如对name列的数值都进行大写转化

df['name'] = df['name'].apply(str.upper)

也可以定义个函数,在apply中进行使用

def double_df(x):
           return 2*x
df1[u'语文'] = df1[u'语文'].apply(double_df)

apply 用在dataframe上,用于对row或者column进行计算
applymap 用于dataframe上,是元素级别的操作
map ,是python自带的,用于series上,是元素级别的操作

问题9:Lambda函数 与 map()

map()使用

map(function, iterable, ...)
# Python 内置的函数,它接收一个函数 f 和一个 list(可迭代类型 dict 为 Hash 不可以),把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
# 计算列表各个元素的平方
def square(x):
	return x * x
print(list(map(square, [1,2,3,4,5])))

lambda 使用

# lambda 参数:操作(参数)
# 也称为匿名函数。如果你不想在程序中对一个函数使用两次,可以用lambda表达式,作用和普通函数一样
# =>一个只用一行就能解决问题的函数

add = lambda x, y: x + y
print(add(5, 6))
# 按照x[1]进行列表排序
a = [(2, 56), (3, 12), (6, 10), (9, 13)]
a.sort(key=lambda x: x[1])
print(a)

# 两个参数的判断语句同理
func = lambda x, y: 0 if x > 0 else y
print(func(5, 6))
print(func(-1, 6))

0 6

# 计算平方数
def square(x):
	return x * x
print(list(map(square, numbers)))

# 使用lambda定义函数
print(list(map(lambda x: x*x, numbers)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值