Pandas 数据清洗

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. 空数据
    2. 数据格式错误
    3. 错误的数据
    4. 重复数据

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")#外部拼接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡小姜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值