Python 数据清洗
python 数据清洗主要依赖 pandas 包
同时还需要掌握 python 自身的一些数据结构和编程技巧
Pandas 是什么?
- Pandas 是一个用于处理数据集的Python库,它具有分析、清理、探索和操作数据的功能。
- “Pandas”这个名字引用了“面板数据”和“Python数据分析”,是由Wes McKinney在2008年创建的。
Pandas 的安装
在控制台中输入以下命令
pip install pandas
或
python -m pip install pandas
导入 Pandas 库到当前工作环境
import pandas as pd
Pandas series
什么是 series?
- Pandas series 就像表格中的一列
- 它是一个可以保存任何类型数据的一维数组。
# 通过一个列表生成一个 Pandas series
# 创建一个列表
a = [1, 7, 2]
# 调用 pd.Series 函数将 列表转换成 series
myvar = pd.Series(a)
# 查看 生成的 series
print(myvar)
0 1
1 7
2 2
dtype: int64
Label
- 如果没有指定其他内容,则用索引号标记这些值。第一个值的索引是0,第二个值的索引是1,以此类推。
- 标签可用于访问指定值。
print(myvar[0])
1
a = [1, 7, 2]
# 创建 label
myvar = pd.Series(a, index = ["x", "y", "z"])
print(myvar)
x 1
y 7
z 2
dtype: int64
DataFrame
什么是 DataFrame?
- Pandas中的 DataFrame(数据集)通常是二维表,其中包含多个 Series。
- 每个series 就像一个列,DataFrame就是整个表
从字典生成自定义的 DataFrame
#创建一个字典
data = {
# 字典有 2 个元素,分别是 x 和 y
# 每个字典的内容由列表构成
"x": [420, 380, 390],
"y": [50, 40, 45]
}
# 调用 pd.DataFrame 函数将字典转换成 DataFrame(数据集)
df = pd.DataFrame(data)
# 查看 数据集
print(df)
x y
0 420 50
1 380 40
2 390 45
定位,访问某一行
print(df.loc[0])
x 420
y 50
Name: 0, dtype: int64
定位,访问多行
# 使用一个列表作为索引
print(df.loc[[0, 1]])
x y
0 420 50
1 380 40
通过关键词作为索引
data = {
# 字典有 2 个元素,分别是 x 和 y
# 每个字典的内容由列表构成
"x": [420, 380, 390],
"y": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df)
x y
day1 420 50
day2 380 40
day3 390 45
通过关键词进行定位,访问目标行
# 访问给定关键词的行
print(df.loc["day2"])
读入外部数据,并返回一个 DataFrame
- 如果数据集存储在硬盘文件中,Pandas可以将它们加载到DataFrame中
读入逗号分隔符文件 (csv) 到 DataFrame
df = pd.read_csv("./data.csv", header=0)
数据清洗
数据清洗
-
数据清理意味着修复数据集中的错误数据。
-
错误数据可能是:
- 空数据
- 数据格式错误
- 错误的数据
- 重复数据
1. 空数据
在分析数据时,空数据可能会返回错误的结果,或导致程序无法运行
处理办法
- 处理空数据的一种方法是删除包含空数据的行
- 在数据集空数据是随机缺失的时候,这通常是可行的
new_df = df.dropna()
注意:
默认情况下,dropna()方法返回一个新的DataFrame,不会改变原来的DataFrame。
# inplace 为 True 的话,则会直接从原来的DataFrame 进行操作
df.dropna(inplace = True)
通过固定的值对 空值进行填补
# 例如 -
df.fillna(-, inplace = True)
仅仅对 指定的列 进行空值填补
df["y"].fillna(3, inplace = True)
利用 均值,中位数或众数对空值进行填补
-
替换空单元格的常用方法是计算列的平均值、中位数或众数值
-
Pandas使用mean() median()和mode()方法来计算指定列的值:
均值填补
x = df["y"].mean()
df["y"].fillna(x, inplace = True)
中位数填补
# 计算中位数
x = df["y"].median()
df["y"].fillna(x, inplace = True)
众数填补
x = df["y"].mode()[0] # 因为 model() 返回的是一个序列,所以需要额外的加上 [0]
df["y"].fillna(x, inplace = True)
格式错误的数据
数据格式错误的数据会使分析变得困难,甚至无法分析
要解决这个问题,有两个选项:
- 删除行
- 将列中的所有单元格转换为相同的格式
转换成正确的格式
df['z'] = pd.to_datetime(df['z'])
删除行
df.dropna(subset=['z'], inplace = True) # subset 为指定列
错误的数据
- “错误的数据”不一定是“空单元格”或“错误的格式”,它可能就是错误的,比如超过了某个合理的范围
- 有时可以通过查看数据集来发现错误的数据。
替换
- 修正错误数据的一种方法是用其他正常值替换它们
删除行
- 处理错误数据的另一种方法是删除包含错误数据的行
- 在某些情况下,你可能不需要分析这样的错误数据
重复数据
发现重复值
- 重复行是指被多次录入的行
- 要发现重复行,可以使用duplicate()函数。
- duplicate()行为每一行返回一个布尔值
print(df.duplicated())
删除重复行
- 要删除副本,可以使用drop_duplates()函数
df.drop_duplicates(inplace = True)
pandas 数据操作
列访问
df.x
df['x']
多列访问
df[["x","y"]]
df.loc[:,["x","y"]]
行访问 / 切片操作 (slicing)
df[0:1]
df.loc[0]
df.loc[0,:]
df.loc[0:0,:]
访问多行
df[0:3]
df.loc[0:3,:] # 或者 df.loc[0:3]
通过位置进行选择访问
- 更多信息请参见使用DataFrame.iloc()或DataFrame.at()按位置选择。
- 通过所传递整数的位置进行选择:
df.iloc[3]
df.iloc[0:2,0:2]
df.iloc[0:2]
df.iloc[0:2,:]
df.iloc[:,1:3]
df.iloc[1,1]
通过布尔值作为索引进行访问
df["y"] > 2.0
df[df["y"] > 2.0]
df["x"].isin([1])
df[df["x"].isin([1])]
拼接 (concat)
纵向拼接
pd.concat([df[0:2], df[2:5]], axis=0)
横向拼接
df.loc[:,"x":"y"]
df.loc[:,"z"]
pd.concat([df.loc[:,"x":"y"], df.loc[:,"z"]], axis=1)
合并 / 连接
df = df.loc[~df.loc[:,"x"].duplicated(),:]
df.iloc[:2,[0,1]]
pd.merge(df.iloc[:2,[0,1]], df.iloc[[0,2],[0,2]], on="x")
pd.merge(df.iloc[:2,[0,1]], df.iloc[[0,2],[0,2]], on="x", how="left") #左侧拼接
pd.merge(df.iloc[:2,[0,1]], df.iloc[[0,2],[0,2]], on="x", how="right")#右侧拼接
pd.merge(df.iloc[:2,[0,1]], df.iloc[[0,2],[0,2]], on="x", how="outer")#外部拼接