数据分析 — Pandas 数据加载、存储和清洗

目录

  • 一、文件读取
    • 1、常见文件读取函数
    • 2、read_csv()
    • 3、read_table()
    • 4、read_excel()
    • 5、read_json()
    • 6、read_html()
    • 7、大文件读取
  • 二、数据保存
    • 1、csv
    • 2、excel
    • 3、json
    • 4、html
    • 5、MySQL
      • 1、连接数据库
      • 2、MySQL 存储到本地
      • 3、本地存储到 MySQL
  • 三、数据清洗
    • 1、处理缺失值
      • 1、判断数据是否为 NAN
      • 2、删除缺失值
      • 3、填充缺失值
    • 2、处理异常值
    • 3、处理重复值
      • 1、判断是否重复
      • 2、默认保留第一个出现的重复行,后续的重复行将被删除
      • 3、对某列进行去重
    • 4、数据转换
    • 5、数据离散化
      • 1、按指定边界值切分
      • 2、等距分箱
      • 3、等频分箱
  • 四、应用

一、文件读取

1、常见文件读取函数

函数说明
read_csv从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号。
read_table从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(‘\t’)。
read_excel从 Excel XLS 或 XLSX file 读取表格数据。
read_json读取 JSON(JavaScript Object Notation)字符串中的数据。
read_sql(使用 SQLAlchemy)读取 SQL 查询结果为 pandas 的 DataFrame。
read_html读取 HTML 文档中的所有表格。
read_hdf读取 pandas 写的 HDF5 文件。
read_clipboard读取剪贴板中的数据,可以看做 read_table 的剪贴板版。在将网页转换为表格时很有用。
read_msgpack二进制格式编码的 pandas 数据。
read_pickle读取 Python pickle 格式中存储的任意对象。
read_sas读取存储于 SAS 系统自定义存储格式的 SAS 数据集。
read_fwf读取定宽列格式数据(也就是说,没有分隔符)。
read_stata读取 Stata 文件格式的数据集。
read_feather读取 Feather 二进制文件格式。

2、read_csv()

read_csv() 是 Pandas 库中的函数,用于从 CSV 文件中读取数据并创建一个 DataFrame。

CSV 格式比 Excel 能存储更多数据,CSV 读取性能比 Excel 会高很多。

参数:

  • filepath_or_buffer:这是必选参数,指定要读取的 CSV 文件的路径或 URL。可以是一个字符串,也可以是类似文件对象的可迭代对象(例如文件句柄)。

  • sep:指定 CSV 文件中的字段分隔符。默认值是逗号(,),但可以根据文件的实际分隔符来设置这个参数,例如制表符(\t)或分号(;)。

  • delimiter:sep 的别名,用于指定字段分隔符。

  • header:指定用作列名的行号。通常为整数,如果没有列名行,可以设置为 None。默认值为 0,表示第一行包含列名。

  • names:如果没有列名行,可以通过此参数提供列名的列表。与 header=None 一起使用。

  • index_col:用于指定哪一列作为 DataFrame 的索引列。可以是列名、列号或多列的组合。

  • usecols:指定要读取的列,可以是列名的列表或列号的列表。用于仅读取感兴趣的列,而不是整个文件。

  • skiprows:指定要跳过的行数,通常用于跳过文件中的标题或注释行。

  • nrows:指定要读取的行数,可以用于限制读取的数据量。

  • dtype:用于指定列的数据类型的字典,可以帮助优化内存使用和数据类型转换。

  • encoding:指定 CSV 文件的字符编码,常见的编码包括 “utf-8”、“ISO8859-1” 等。

  • parse_dates:指定要解析为日期时间的列,可以是列名或列号的列表。

  • date_parser:自定义日期时间解析函数,用于将字符串解析为日期时间对象。

  • na_values:指定要视为缺失值的标记值列表,例如 “NA”、“N/A”、“null” 等。

  • skipinitialspace:指定是否跳过字段值前的空白字符,默认为 False。

  • skip_blank_lines:指定是否跳过空白行,默认为 True。

  • quotechar:指定用于引用字段值的字符,通常为双引号或单引号。

  • compression:指定文件的压缩格式,例如 “gzip”、“bz2”、“xz” 等。

  • thousands:用于指定千位分隔符的字符。

常用参数案例:

1、文件路径 path 和编码方式 encoding

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,encoding='ANSI')
print(data)

在这里插入图片描述

查看编码方式 encoding
将文件选择记事本方式打开,另存为时有编码方式

2、设置表头 header

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
# header=0 表示物理的第一行设置为表头
data = pd.read_csv(path,header=0,encoding='ANSI')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
# header=1 表示物理的第二行设置为表头
data = pd.read_csv(path,header=1,encoding='ANSI')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
# header=None 表示源数据不设置表头
data = pd.read_csv(path,header=None,encoding='ANSI')
print(data)

在这里插入图片描述

3、设置索引列 index_col

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,index_col=1,encoding='ANSI')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,index_col='日期',encoding='ANSI')
print(data)

在这里插入图片描述

4、取部分列 usecols

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,usecols=[0,2,3],encoding='ANSI')
print(data)

在这里插入图片描述

5、元素的类型 dtype

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,encoding='ANSI')
# 查看类型
print(type(data))  # <class 'pandas.core.frame.DataFrame'># 查看元素类型
print(data.dtypes)
# 日期      object
# 股票0    float64
# 股票1    float64
# 股票2    float64
# 股票3    float64
# 股票4    float64
# dtype: object# 查看详细信息摘要
print(data.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10000 entries, 0 to 9999
# Data columns (total 6 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   日期      10000 non-null  object
#  1   股票0     10000 non-null  float64
#  2   股票1     10000 non-null  float64
#  3   股票2     10000 non-null  float64
#  4   股票3     10000 non-null  float64
#  5   股票4     10000 non-null  float64
# dtypes: float64(5), object(1)
# memory usage: 468.9+ KB
# None
data2 = pd.read_csv(path,dtype={'股票1':str},encoding='ANSI')
# 查看详细信息摘要
print(data2.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10000 entries, 0 to 9999
# Data columns (total 6 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   日期      10000 non-null  object
#  1   股票0     10000 non-null  float64
#  2   股票1     10000 non-null  object
#  3   股票2     10000 non-null  float64
#  4   股票3     10000 non-null  float64
#  5   股票4     10000 non-null  float64
# dtypes: float64(4), object(2)
# memory usage: 468.9+ KB
# None

6、设置某列为日期格式 parse_dates

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\exa5.csv'
data = pd.read_csv(path,parse_dates=['日期'],encoding='ANSI')
print(data.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10000 entries, 0 to 9999
# Data columns (total 6 columns):
#  #   Column  Non-Null Count  Dtype         
# ---  ------  --------------  -----         
#  0   日期      10000 non-null  datetime64[ns]
#  1   股票0     10000 non-null  float64       
#  2   股票1     10000 non-null  float64       
#  3   股票2     10000 non-null  float64       
#  4   股票3     10000 non-null  float64       
#  5   股票4     10000 non-null  float64       
# dtypes: datetime64[ns](1), float64(5)
# memory usage: 468.9 KB
# None

7、把指定值变成空值 na_values

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data1.csv'
data = pd.read_csv(path,na_values=[2.52],encoding='ANSI')
print(data)

在这里插入图片描述

3、read_table()

参数同 read_csv(), read_csv() 和 read_table() 之间的区别主要是函数名称,默认分隔符的历史设置。

在当前版本的 Pandas 中,它们几乎可以互相替代,只需根据实际数据文件的分隔符来设置 sep 参数即可。

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data1.csv'
data = pd.read_table(path,encoding='ANSI')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data1.csv'
# 可以读取 csv 文件
data = pd.read_table(path,encoding='ANSI',sep=',')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data2.txt'
data = pd.read_table(path)
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data2.txt'
# 如果分裂空格个数不一致,可使用正则方式进行匹配
data = pd.read_table(path,sep='\s+')
print(data)

在这里插入图片描述

4、read_excel()

import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data3.xlsx'
# 读取表格指定工作表数据
# sheet_name='评论' 或 sheet_name=1
data = pd.read_excel(path,sheet_name='评论')
print(data)

在这里插入图片描述

5、read_json()

// F:\data\data4.json
[{"id": "A001","name": "百度","url": "www.baidu.com"},{"id": "A002","name": "谷歌","url": "www.google.com"},{"id": "A003","name": "淘宝","url": "www.taobao.com"}
]
import pandas as pd  # 导入 Pandas 库并使用别名 pd
path = r'F:\data\data4.json'
data = pd.read_json(path,encoding='utf-8')
print(data)
print(type(data))  # <class 'pandas.core.frame.DataFrame'>
dd = data.to_string()
print(type(dd))  # <class 'str'>

在这里插入图片描述

6、read_html()

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.read_html('https://www.air-level.com/rank')
print(data)

在这里插入图片描述

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.read_html('https://www.air-level.com/rank')[0]
print(data)

在这里插入图片描述

7、大文件读取

import pandas as pd  # 导入 Pandas 库并使用别名 pd# 设置文件路径
path = r'F:\data\data1.csv'
# 使用 Pandas 的 read_csv 函数读取 CSV 文件,chunksize=1000 表示每次读取1000行数据,encoding='ANSI' 指定编码方式为ANSI
data = pd.read_csv(path, chunksize=1000, encoding='ANSI')# 创建一个空列表用于存储分块数据
chunks = []
# 遍历每个数据块
for chunk in data:# 将每个数据块转换为 Pandas DataFramechunk = pd.DataFrame(chunk)# 将 DataFrame 添加到 chunks 列表中chunks.append(chunk)
# 使用 concat 函数将所有数据块连接成一个完整的数据集
dataCount = pd.concat(chunks)
# 打印合并后的数据集
print(dataCount)

在这里插入图片描述

二、数据保存

1、csv

data.to_csv('数据.csv',header=True,index=True,mode='w')

2、excel

data.to_excel('./数据.xlsx',sheet_name='详细数据',index=True,header=True)

3、json

data.to_json('数据.json')

4、html

data.to_html('./haha.html',encoding='utf-8')

5、MySQL

1、连接数据库

方式一

import pymysql  # 导入 pymysql 模块,用于连接 MySQL 数据库
import pandas as pd  # 导入 Pandas 库并使用别名 pd# 使用 pymysql.connect() 函数建立 MySQL 数据库连接,提供主机名、用户名、密码、数据库名、端口号和字符集等信息
conn = pymysql.connect(host='localhost',  # 数据库主机名user='root',       # 数据库用户名password='123456',  # 数据库密码db='shop',         # 要连接的数据库名port=3306,          # 数据库端口号,默认为3306charset='utf8'      # 字符集设置为utf8,确保支持中文字符
)# 定义 SQL 查询语句,从名为 "custom" 的表中选取所有数据
sql = """select * from custom"""
# 使用 pandas 的 read_sql() 函数从数据库中读取数据,并存储在 DataFrame 中
data = pd.read_sql(sql, conn)
# 打印 DataFrame 中的数据
print(data)

方式二

import sqlalchemy  # 导入 sqlalchemy 模块,用于数据库连接
import pandas as pd  # 导入 Pandas 库并使用别名 pd# 使用 sqlalchemy.create_engine() 函数创建 MySQL 数据库引擎对象,提供数据库连接信息
engine = sqlalchemy.create_engine('mysql+pymysql://root:123456@localhost:3306/shop?charset=utf8')
# 打印数据库引擎对象,这里主要是为了确认数据库连接信息是否正确
print(engine)# 定义 SQL 查询语句,从名为 "custom" 的表中选取所有数据
sql = """select * from custom"""
# 使用 pandas 的 read_sql() 函数从数据库中读取数据,并存储在 DataFrame 中
data = pd.read_sql(sql, engine)
# 打印 DataFrame 中的数据
print(data)

2、MySQL 存储到本地

data.to_excel('./shop.xlsx')

3、本地存储到 MySQL

data.to_sql(name='custom2',con='mysql+pymysql://root:123456@localhost:3306/shop?charset=utf8',if_exists='replace',index=False)

三、数据清洗

1、处理缺失值

1、判断数据是否为 NAN

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
data = pd.Series(['one','two',np.nan,'four',np.nan])
print(data)
# 0     one
# 1     two
# 2     NaN
# 3    four
# 4     NaN
# dtype: object# 返回哪些值是缺失值的布尔值
print(pd.isnull(data))
# 0    False
# 1    False
# 2     True
# 3    False
# 4     True
# dtype: bool# 返回值是 isnull 的反集
print(pd.notnull(data))
# 0     True
# 1     True
# 2    False
# 3     True
# 4    False
# dtype: bool

2、删除缺失值

dropna() 是 Pandas 库中的一个函数,用于从数据框(DataFrame)或者 Series 中删除包含缺失值(NaN 或 None)的行或列。
参数:

  • axis(可选参数):指定要删除的轴,可以是 0(默认值)表示删除行,或者 1 表示删除列。

    • axis=0(默认值):删除包含缺失值的行。

    • axis=1:删除包含缺失值的列。

  • how(可选参数):指定删除的方式。

    • how=‘any’(默认值):只要某行或列中存在任何缺失值,就删除该行或列。
    • how=‘all’:只有当某行或列中所有元素都是缺失值时,才删除该行或列。
  • thresh(可选参数):指定在删除行或列之前必须满足的非缺失值数量的阈值。默认值为 None,表示不考虑阈值。

    • 示例:thresh=2:要求至少有 2 个非缺失值才能保留行或列。
  • subset(可选参数):指定要考虑的特定行或列的标签(label),默认值为 None。这个参数可以用来针对部分行或列执行 dropna() 操作。

    • 示例:subset=[‘column1’, ‘column2’]:只在指定的列中删除包含缺失值的行。
  • inplace(可选参数):默认值为 False,表示返回一个新的数据框,不修改原始数据。如果设置为 True,则在原始数据上进行就地修改,并且不返回新的数据框。

1、删除包含缺失值的行

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'A': [1, 2, None, 4],'B': [5, None, 7, 8]})
print(data)
#      A    B
# 0  1.0  5.0
# 1  2.0  NaN
# 2  NaN  7.0
# 3  4.0  8.0# 删除包含缺失值的行
result = data.dropna()
print(result)
#      A    B
# 0  1.0  5.0
# 3  4.0  8.0

2、删除包含缺失值的列

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[NA,8,8],[NA,NA,8],[NA,4,5],[NA,7,8]])
print(data)
#     0    1  2
# 0 NaN  8.0  8
# 1 NaN  NaN  8
# 2 NaN  4.0  5
# 3 NaN  7.0  8# 删除包含缺失值的列
result = data.dropna(axis=1)
print(result)
#    2
# 0  8
# 1  8
# 2  5
# 3  8

3、删除所有值为 NaN 的行

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,4,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  4.0  5.0
# 3  NaN  7.0  8.0# 删除所有值为 NaN 的行
result = data.dropna(how='all')
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 2  NaN  4.0  5.0
# 3  NaN  7.0  8.0

4、至少有 2 个非缺失值才能保留行或列

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 至少有 2 个非缺失值才能保留行或列
result = data.dropna(thresh=2)
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 3  NaN  7.0  8.0

3、填充缺失值

fillna() 是 Pandas 库中的一个函数,用于在数据框(DataFrame)或者 Series 中填充缺失值(NaN 或 None)。

参数:

  • value(可选参数):用于填充缺失值的具体数值或字典,可以是标量(单个数值)、字典(列名与填充值的映射关系)、Series 或者 DataFrame。
  • method(可选参数):指定填充缺失值的方法,可以是前向填充(‘ffill’),后向填充(‘bfill’)等。
    • method=‘ffill’(默认值):前向填充。
    • method=‘bfill’:后向填充。
  • axis(可选参数):指定填充的轴,可以是 0(按列填充)或 1(按行填充)。
    • axis=0(默认值):删除包含缺失值的行。
    • axis=1:删除包含缺失值的列。
  • inplace(可选参数):是否在原地修改数据框,默认值为 False,表示返回一个新的数据框,不修改原始数据。如果设为 True,将不返回新的数据框,而是直接在原有数据框上进行修改。
  • limit(可选参数):用于限制填充的数量,比如设为2,表示每列或每行最多只填充两个缺失值。
  • downcast(可选参数):控制数据类型的转换,可以是 ‘integer’、‘signed’、‘unsigned’ 等。

1、填充为0

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 填充为0
result = data.fillna(0)
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  0.0  0.0  0.0
# 2  0.0  0.0  5.0
# 3  0.0  7.0  8.0

2、不同列填充不值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 不同列填充不值
result = data.fillna({0:100,1:200,2:300})
print(result)
#        0      1      2
# 0    8.0    8.0    8.0
# 1  100.0  200.0  300.0
# 2  100.0  200.0    5.0
# 3  100.0    7.0    8.0

3、填充平均值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 填充平均值
result = data.fillna(data.mean())
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  8.0  7.5  7.0
# 2  8.0  7.5  5.0
# 3  8.0  7.0  8.0

4、向上填充

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 向上填充
result = data.fillna(method='ffill')
# 高版本写法
# result = data.ffill()
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  8.0  8.0  8.0
# 2  8.0  8.0  5.0
# 3  8.0  7.0  8.0

5、向下填充

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  NaN  NaN
# 2  NaN  NaN  5.0
# 3  NaN  7.0  8.0# 向下填充
result = data.fillna(method='bfill')
# 高版本写法
# result = data.bfill()
print(result)
#      0    1    2
# 0  8.0  8.0  8.0
# 1  NaN  7.0  5.0
# 2  NaN  7.0  5.0
# 3  NaN  7.0  8.0

6、把下标为1的列转成字符串

import pandas as pd  # 导入 Pandas 库并使用别名 pd
from numpy import nan as NA  # 将NumPy库中的NaN(Not a Number)定义为NA
data = pd.DataFrame([[8,8,8],[NA,NA,NA],[NA,NA,5],[NA,7,8]])
print(data.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 4 entries, 0 to 3
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   0       1 non-null      float64
#  1   1       2 non-null      float64
#  2   2       3 non-null      float64
# dtypes: float64(3)
# memory usage: 224.0 bytes
# None# 把下标为1的列转成字符串
data.iloc[:,1] = data.iloc[:,1].astype(str)
print(data.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 4 entries, 0 to 3
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype  
# ---  ------  --------------  -----  
#  0   0       1 non-null      float64
#  1   1       4 non-null      object 
#  2   2       3 non-null      float64
# dtypes: float64(2), object(1)
# memory usage: 224.0+ bytes
# None

2、处理异常值

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
data = pd.DataFrame(np.random.randn(1000,4))
print(data)
#             0         1         2         3
# 0    1.593943 -0.044275  1.657758  0.771481
# 1   -0.747987 -1.225241 -0.306258 -0.457629
# 2    0.902807  0.783800  0.914563 -0.929200
# 3   -1.516675 -0.361840  0.067688 -0.323513
# 4   -0.162813  0.075606  0.828714 -1.907542
# ..        ...       ...       ...       ...
# 995 -0.760415  1.091292  0.453288 -0.072843
# 996 -0.644722 -3.389364  0.462951  1.742291
# 997 -2.130310 -0.406691  0.656790 -1.790120
# 998  0.079858 -1.282808  1.425582  0.118225
# 999 -1.201616 -0.747731 -0.566635  0.396431
#
# [1000 rows x 4 columns]
# 查看大概
# count:非空计数个数,mean:平均值,std:标准差,min:最小值,max:最大值
# 25%:表示25%分位,50%:表示50%分位,75%:表示75%分位
print(data.describe())
#                  0            1            2            3
# count  1000.000000  1000.000000  1000.000000  1000.000000
# mean      0.033990     0.079743    -0.025394    -0.037519
# std       0.987878     0.994122     1.024085     1.017784
# min      -3.422642    -3.389364    -3.218303    -3.292692
# 25%      -0.619548    -0.609269    -0.743909    -0.711874
# 50%       0.048188     0.090974     0.012549    -0.029922
# 75%       0.713032     0.770695     0.682448     0.658831
# max       3.029603     3.100089     3.340088     3.041642
data.iloc[1,1] = 10000
print(data.describe())
#                  0             1            2            3
# count  1000.000000   1000.000000  1000.000000  1000.000000
# mean     -0.014753     10.010379     0.018077    -0.023255
# std       1.021477    316.228973     1.028808     0.994172
# min      -2.811835     -3.671985    -3.021773    -2.878964
# 25%      -0.698100     -0.665801    -0.695405    -0.686040
# 50%      -0.011187     -0.007452    -0.006795     0.008633
# 75%       0.706559      0.708378     0.694225     0.630325
# max       2.966771  10000.000000     3.183331     3.617062
import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'A': [1, 2, 3, -999, 5],'B': [-1, 7, -999, 9, 10]})
print(data)
#      A    B
# 0    1   -1
# 1    2    7
# 2    3 -999
# 3 -999    9
# 4    5   10# 将异常值-999替换为 NaN
data.replace(-999, float('nan'), inplace=True)
# 输出替换后的数据框
print(data)
#      A     B
# 0  1.0  -1.0
# 1  2.0   7.0
# 2  3.0   NaN
# 3  NaN   9.0
# 4  5.0  10.0# 定义替换规则,将-999替换为 NaN,将-1替换为0
replace_dict = {-999: float('nan'), -1: 0}
# 应用替换规则到数据框
data.replace(replace_dict, inplace=True)
# 输出替换后的数据框
print(data)
#      A     B
# 0  1.0   0.0
# 1  2.0   7.0
# 2  3.0   NaN
# 3  NaN   9.0
# 4  5.0  10.0

Series.replace() 是 Pandas 库中用于替换 Series 中元素值的函数。它允许用户根据指定的规则,将 Series 中的某个值替换为另一个值或一组值。

参数:

  • to_replace(可选参数):指定要替换的值。

    • 示例:to_replace=5,表示要将 Series 中的所有值为 5 的元素进行替换。
  • value(可选参数):用于替换 to_replace 中指定值的具体数值或字典。

    • 示例:value=10,表示将 to_replace 中的值为 5 的元素替换为 10。
  • inplace(可选参数):是否在原地修改 Series,默认值为 False。如果设为 True,将不返回新的 Series,而是直接在原有 Series 上进行修改。

    • 示例:inplace=True,在原始 Series 上就地进行值的替换,不返回新的 Series。
  • limit(可选参数):用于限制替换的数量,比如设为2,表示最多只替换两次。默认值为 False。

    • 示例:limit=2,最多替换两次。
  • regex(可选参数):是否启用正则表达式进行匹配,默认值为 False。如果设为 True,to_replace 可以是正则表达式。

    • 示例:regex=True,使用正则表达式进行匹配。
  • method(可选参数):指定替换的方法,可选值为 ‘pad’、‘ffill’(前向填充)或 ‘bfill’(后向填充)。

    • method=‘pad’:前向填充,也被称为 forward fill,使用该值之前的最近的非缺失值来替换缺失值。

    • method=‘ffill’:前向填充,ffill 是 forward fill 的缩写。与 ‘pad’ 相同,使用该值之前的最近的非缺失值来替换缺失值。

    • method=‘bfill’:后向填充,也被称为 backward fill。使用该值之后的最近的非缺失值来替换缺失值。

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.Series([4000,5000,9000,900000,-1000])
data = data.replace(-1000,6000)
print(data)
# 0      4000
# 1      5000
# 2      9000
# 3    900000
# 4      6000
# dtype: int64data = data.replace({900000:9000,-1000:6000})
print(data)
# 0    4000
# 1    5000
# 2    9000
# 3    9000
# 4    6000
# dtype: int64

3、处理重复值

drop_duplicates() 是 Pandas 库中用于删除 DataFrame 或 Series 中重复行的函数。该函数默认根据所有列的数值进行比较,并删除相同的行,保留第一次出现的行。

参数:

  • subset(可选参数):指定要考虑的特定列或列的标签,用于确定重复性。只考虑这些列的数值,而不是整行。默认值为 False。
    • 示例:subset=[‘column1’, ‘column2’],只在指定的列中判断重复性。
  • keep(可选参数):确定保留哪个重复的实例。
    • keep= ‘first’(默认值):保留第一次出现的实例。
    • keep=‘last’:保留最后一次出现的实例。
    • keep=False:删除所有重复的实例。
  • inplace(可选参数):是否在原地修改 DataFrame 或 Series,如果设为 True,将不返回新的对象,而是直接在原有对象上进行修改。默认值为 False。
    • 示例:inplace=True,在原始 DataFrame 或 Series 上就地删除重复行,不返回新的对象。

1、判断是否重复

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'k1':list('abababaa'),'k2':[1,1,2,2,3,3,4,4]})
print(data)
#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   2
# 4  a   3
# 5  b   3
# 6  a   4
# 7  a   4# 判断是否重复
print(data.duplicated().sum())  # 1

2、默认保留第一个出现的重复行,后续的重复行将被删除

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'k1':list('abababaa'),'k2':[1,1,2,2,3,3,4,4]})
print(data)
#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   2
# 4  a   3
# 5  b   3
# 6  a   4
# 7  a   4# 默认保留第一个出现的重复行,后续的重复行将被删除
print(data.drop_duplicates())
#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   2
# 4  a   3
# 5  b   3
# 6  a   4

3、对某列进行去重

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'k1':list('abababaa'),'k2':[1,1,2,2,3,3,4,4]})
print(data)
#   k1  k2
# 0  a   1
# 1  b   1
# 2  a   2
# 3  b   2
# 4  a   3
# 5  b   3
# 6  a   4
# 7  a   4# 对某列进行去重
print(data.drop_duplicates(['k1']))
#   k1  k2
# 0  a   1
# 1  b   1

4、数据转换

需求:data 加一列 “animal”

1、对 food 处理,把它全部变成小写

2、使用 map 对字典映射

3、加入到原数据里

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'food':['Banana','bone','Grass','fish','worm'],'calorie':[10,20,30,40,50]})
print(data)
#      food  calorie
# 0  Banana       10
# 1    bone       20
# 2   Grass       30
# 3    fish       40
# 4    worm       50eat_animal = {'grass':'cattle','banana':'monkey','fish':'cat','worm':'frog' ,'bone':'dog'
}
data["animal"] = data['food'].str.lower().map(eat_animal)
print(data)
#      food  calorie  animal
# 0  Banana       10  monkey
# 1    bone       20     dog
# 2   Grass       30  cattle
# 3    fish       40     cat
# 4    worm       50    frog

5、数据离散化

pd.cut() 是 Pandas 中用于将连续数据分割成离散区间的函数,通常用于数据的离散化或分箱处理。

参数:

  • x(必需参数):要分割的数据,可以是 Series 或数组。

  • bins(必需参数):用于指定分割区间的边界值,可以是一个整数、序列(例如列表或数组),或者一个区间数。如果是整数,表示分成的等宽区间数;如果是序列,表示自定义的分割点;如果是区间数,表示区间范围。

  • labels(可选参数):用于指定每个区间的标签,通常是字符串或者其他可哈希的对象。如果未指定,结果将包含区间的标签。

  • right(可选参数,默认为 True):指定区间的开闭,如果为 True,区间右侧是闭区间,如果为 False,区间右侧是开区间。

  • include_lowest(可选参数,默认为 False):指定最左侧的区间是否包含在分箱中。

  • retbins(可选参数,默认为 False):如果为 True,则返回划分的区间。

  • precision(可选参数):区间精度,用于四舍五入区间边界值。

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
# 创建一个示例的一维数组
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 定义区间的方式
bins = [0, 3, 6, 9, 12]
# 使用 pd.cut() 进行离散化
data = pd.cut(data, bins, right=True, labels=['Category 1', 'Category 2', 'Category 3', 'Category 4'])
# 输出离散化后的数据
print(data)
# ['Category 1', 'Category 1', 'Category 1', 'Category 2', 'Category 2', 'Category 2', 'Category 3', 'Category 3', 'Category 3', 'Category 4']
# Categories (4, object): ['Category 1' < 'Category 2' < 'Category 3' < 'Category 4']

1、按指定边界值切分

import pandas as pd  # 导入 Pandas 库并使用别名 pd
data = pd.DataFrame({'Scores': [85, 92, 78, 60, 72, 88, 92, 98, 55, 75]})
print(data)
#    Scores
# 0      85
# 1      92
# 2      78
# 3      60
# 4      72
# 5      88
# 6      92
# 7      98
# 8      55
# 9      75# 按指定边界值切分
bins = [0,60,70,80,90,100]
# 使用 right=False 表示右边不包含 [0,60) [60,70) [70,80)... labels 给分段打标签
data['Level']=pd.cut(data['Scores'],bins,labels=['E','D','C','B','A'],right=False)
print(data)
#    Scores Level
# 0      85     B
# 1      92     A
# 2      78     C
# 3      60     D
# 4      72     C
# 5      88     B
# 6      92     A
# 7      98     A
# 8      55     E
# 9      75     C

2、等距分箱

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
# 等距分箱 --- 区间相等或近似相等
data = np.random.randint(1,30,30)
print(data)
# [10 17  6 17 13 29 14 21 27  2  1  5 20 13 18  3 28  1 20  5  4 23 17 22 16 26  8 18 18 23]dd = pd.cut(data,5)
# 统计值的个数
print(dd.value_counts())
# (0.972, 6.6]    9
# (6.6, 12.2]     9
# (12.2, 17.8]    2
# (17.8, 23.4]    5
# (23.4, 29.0]    5
# Name: count, dtype: int64

3、等频分箱

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
# 等频分箱---落在每个区间的数据点的个数相等或近似相等
data = np.random.randint(1,100,50)  # 取1-100之间的随机整数,取50个
print(data)
# [55  2  7 57 82 62 78 13  5 31 82 98 26 50 72 92 34 49 72 26 16 21  9 21 6 47 57 12 53 48 99 95 11 43 91 19 39 50 54 82 51 45 59 90 54 25 18 67 53 62]# 分为4个区间
dd = pd.qcut(data,4)
print(dd.value_counts())
# (1.999, 22.0]    13
# (22.0, 50.0]     13
# (50.0, 65.75]    11
# (65.75, 99.0]    13
# Name: count, dtype: int64

四、应用

按需求清洗数据

import pandas as pd  # 导入 Pandas 库并使用别名 pd
import numpy as np  # 导入 NumPy 库并使用别名 np
# 读取 CSV 文件到 DataFrame,设置第一列为索引
data = pd.read_csv(r'F:\data\电子产品销售分析.csv', index_col=0)
# 显示数据集的前几行
data.head()

在这里插入图片描述

# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 处理 'event_time' 列,提取日期和时间
f = lambda x: x.split(' ')[0]  # 定义匿名函数提取日期
data['date'] = data['event_time'].map(f)  # 创建新的 'date' 列存储日期
# 显示数据集的前几行
data.head()

在这里插入图片描述

f = lambda x: x.split(' ')[1]  # 定义匿名函数提取时间
data['time'] = data['event_time'].map(f)  # 创建新的 'time' 列存储时间
# 显示数据集的前几行
data.head()

在这里插入图片描述

# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 将 'date' 列转换为日期格式
data['date'] = pd.to_datetime(data['date'])
# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 提取日期中的月份,年份和季度
data['month'] = data['date'].dt.month
data['year'] = data['date'].dt.year
data['quarter'] = data['date'].dt.quarter
# 显示数据集的前几行
data.head()

在这里插入图片描述

# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 将 'user_id' 和 'category_id' 列转换为整数类型
data['user_id'] = data['user_id'].astype('int')
data['category_id'] = data['category_id'].astype('int')
# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 检查数据集中的缺失值
data.isnull().sum()
# 将 'category_code' 列的空值填充为 'N'
data['category_code'].fillna('N', inplace=True)
# 查看数据集的概览信息
data.info()

在这里插入图片描述

# 删除数据集中的重复值
data.drop_duplicates(inplace=True)
# 检查数据集中的异常值,使用 describe() 默认只统计数值数据
data.describe(include='all')
# 按条件筛选数据集,保留 'date' 大于等于 '2020-01-01' 的行
data2 = data[data['date'] >= '2020-01-01']
# 显示数据集的前几行
data2.head()

在这里插入图片描述

# 打印筛选后的数据集的形状
data2.shape  # (562188, 16)

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Aster实现一台电脑当两台使——副屏使用独立win账号

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

LaTeX中的documentclass命令:指定文档的类型和整体布局

诸神缄默不语-个人CSDN博文目录 documentclass 是 LaTeX 中一个基础且重要的命令&#xff0c;用于定义文档的整体布局和样式。这个命令告诉 LaTeX 编译器文档是属于哪一类的&#xff0c;比如是文章、报告、书籍等&#xff0c;每一类都有其预定义的格式和结构。 文章目录 基本语…

怎么恢复电脑重装前的数据?介绍几种有效的方法

在日常生活和工作中&#xff0c;电脑已成为我们不可或缺的工具。然而&#xff0c;有时候我们会遇到一些突发情况&#xff0c;比如电脑系统崩溃需要重新安装系统。在这个过程中&#xff0c;我们可能会失去一些重要的数据&#xff0c;比如照片、文档、视频等。这些数据可能包含着…

基于springboot车辆充电桩管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;车辆充电桩管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;…

马斯克评 OpenAI 视频模型,接地气又一针见血

马斯克评 OpenAI Sora 昨天&#xff0c;OpenAI 发布了首个视频生成模型 Sora。 一位 X&#xff08;前推特&#xff09;用户分享了 Sora 官网所展示的生成视频&#xff1a;一名女子在东京街头漫步。 该用户评论称&#xff1a;"OpenAI 今天宣布了 Sora&#xff0c;它使用混合…

为什么MySQL不建议使用TEXT字段?

当我们深入探讨“为什么MySQL不建议使用TEXT字段&#xff1f;”这一问题时&#xff0c;可以从一下多个方面来详细理解这个问题&#xff1a; 1. 性能问题 性能问题是MySQL不建议使用TEXT字段的一个重要原因。TEXT字段通常以外部存储方式保存&#xff0c;而不是像固定长度或可变…

C# winfrom实例:四路激光测距雷达数据采集和波形图绘制

1.所述产品 产品型号&#xff1a;TFmini Plus 相关资料下载地址&#xff1a;http://www.benewake.com/download 产品名称&#xff1a;TFmini Plus激光雷达模组制造商公司&#xff1a;北醒&#xff08;北京&#xff09;光子科技有限公司 2.产品功能&#xff1a;TFmini Plus是基…

实现低功耗设计的嵌入式系统技术

&#xff08;本文为简单介绍&#xff0c;观点来源网络&#xff09; 在嵌入式系统设计中&#xff0c;追求低功耗已成为一个核心指标&#xff0c;旨在延长设备的运行时间并提升能效。实现这一目标的途径是多元的&#xff0c;涉及从硬件选型到软件算法的各个层面。 首先&#xf…

【Py/Java/C++三种语言详解】LeetCode每日一题240217【二叉树BFS】LeetCode429、N叉树的层序遍历

有LeetCode交流群/华为OD考试扣扣交流群可加 948025485 可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1336了解算法冲刺训练 文章目录 题目链接题目链接题目描述解题思路DFS和BFS异同用队列维护的BFS 代码PythonJavaC时空复杂度 相关习题华为OD算法/大厂面…

基于MapVGL的地理信息三维度数据增长可视化

写在前面 工作中接触&#xff0c;简单整理博文内容为 基于MapVGL的地理信息维度数据增长可视化 Demo理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都…

市场复盘总结 20240208

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…

第五节笔记:LMDeploy 大模型量化部署实践

大模型部署背景 参数用FP16半精度也就是2字节&#xff0c;7B的模型就大约占14G 2.LMDeploy简介 量化降低显存需求量&#xff0c;提高推理速度 大语言模型推理是典型的访问密集型&#xff0c;因为是decoder only的架构&#xff0c;需要token by token的生成&#xff0c;因…

从代码的层面掌握LLM的路线

原则&#xff1a;从易到难&#xff0c;只用 pytorch 从第一个项目来熟悉 transformer 的使用&#xff1b; 从第二个项目来掌握对训练数据的使用方法及 transformer 的 decoder 的细节&#xff1b; 从第三个项目来理解 LLM 的整个过程&#xff1b; 1&#xff0c;Transformer t…

C++-手把手教你模拟实现string

1.string的成员变量 模拟实现string只需要三个成员变量&#xff0c;capacity&#xff0c;size&#xff0c;_str&#xff0c;也就是容量&#xff0c;数据大小&#xff0c;指向字符串的指针。 2.string的构造函数 2.1 使用字符串构造 使用字符串来构造一个string类的对象&…

Days 33 ElfBoard 固定CPU频率

ELF 1开发板选用的是主频800MHz NXP的i.MX6ULL处理器。根据实际的应用场景&#xff0c;如果需要降低CPU功耗&#xff0c;其中一种方法可以将CPU频率固定为节能模式&#xff0c;下面以这款开发板为例给小伙伴们介绍一下固定CPU频率的方法。 先来介绍一下与CPU频率相关的命令&…

希捷与索尼集团合作生产HAMR写头激光二极管

最近有报道指出&#xff0c;希捷&#xff08;Seagate&#xff09;在生产其采用热辅助磁记录&#xff08;HAMR&#xff09;技术的大容量硬盘时&#xff0c;并非所有组件都在内部制造。根据日经新闻的一份新报告&#xff0c;希捷已与索尼集团合作&#xff0c;由索尼为其HAMR写头生…

重塑高校评价体系,缓解内卷,培养有远见的研究者

重塑高校评价体系&#xff0c;缓解内卷&#xff0c;培养有远见的研究者 摘要&#xff1a;当前高等教育和科研环境中普遍存在的“非升即走”制度&#xff0c;尽管表面上看似激励科研人员努力工作&#xff0c;但实际上反映了学术界的内卷状况。这一制度的设置在人才供过于求的背景…

实验二 物理内存管理-实验部分

目录 一、知识点 1、计算机体系结构/内存层次 1.1、计算机体系结构 1.2、地址空间&地址生成 1.3、伙伴系统&#xff08;Buddy System&#xff09; 2、非连续内存分配 2.1、段式存储 2.2、页式存储 2.3、快表和多级页表 2.4、段页式存储 3、X86的特权级与MMU 3.…

FPGA中的模块调用与例化

目录 一、模块调用与实例化 1.1 模块调用 1.2 模块实例化 1.3 Verilog例化语句及其用法 1.3.1 例化语句的基本格式 1.3.2 实例化三种不同的连接方法 二、模块调用实例-全加器与半加器 2.1 半加器模块 2.2 全加器模块 三、参数定义关键词与整数型寄存器 3.1 参数定义关…