pandas 清洗 MySQL 数据

Posted MS_Andrew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas 清洗 MySQL 数据相关的知识,希望对你有一定的参考价值。

读取数据

  • 使用 pdread_sql 读取数据
import pymysql
import pandas as pd

self.conn = pymysql.connect(host=host, user=user,
password=pass, db=db, charset=\'utf8\')

sql = \'select * from table_name\'
df = pd.read_sql(sql, con=self.conn)

空值空格处理

  • 处理空值以及空格使用 pdstrip 方法以及 dropna 方法
df[\'product_name\'].str.strip() 
# 删除列 `product_name` 为 `NaN` 的行 
df.dropna(subset=[\'product_name\'], inplace=True)

异常值处理

  • 处理异常值使用 pdreplace 方法
df.replace(\' \', np.nan, inplace=True)

数据重新写入到 MySQL

  • 数据重新写入 MySQL 使用 pdto_sql 方法
df.to_sql(name=table_name, con=self.conn, if_exists=\'append\', index=True)

问题

1、pd 的 to_sql 不能使用 pymysql 的连接,否则就会直接报错

pandas.io.sql.DatabaseError: Execution failed on sql \'SELECT name FROM sqlite_master WHERE type=\'table\' AND name=?;\': not all arguments converted during string formatting

需要改为

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://user:pass@host:port/db")

2、空值处理的问题

  • 保存在 mysql 中的数据中有空值,但是使用 pd.str.strip() 处理没有用
  • 使用 replace 替换空格、空值为 nan 也没有用

    解决办法:replace 使用正则替换

# 替换\\r\\n\\t以及html中的\\xa0
df.replace(r\'\\r|\\t|\\n|\\xa0\', \'\', regex=True, inplace=True)
# 替换空格,将空格替换为空字符串
df[\'product_name\'].replace(r\' \', \'\', regex=True, inplace=True)
# 将空字符串替换为 nan
df[\'product_name\'].replace(r\'\', np.nan, regex=True, inplace=True)
# 将乱码替换替换为空字符串(正则为匹配不是中文、字母、数字组成的字符串)
df[\'product_name\'].replace(r\'[^\\u4e00-\\u9fa5_a-zA-Z0-9]\', np.nan, regex=True, inplace=True)
  • 本文是有 FreeOpenWrite 发布

以上是关于pandas 清洗 MySQL 数据的主要内容,如果未能解决你的问题,请参考以下文章

利用pandas对在链家网爬取的租房数据进行清洗

学习pandas全套代码超详细数据查看输入输出选取集成清洗转换重塑数学和统计方法排序

2.pandas数据清洗

#yyds干货盘点#Pandas数据清洗实用指南

用pandas进行数据清洗(Data Analysis Pandas Data Munging/Wrangling)

pandas 文本处理大全(附代码)