• 记一次用dataframe进行数据清理


    总结一下dataframe读取数据库,以及整理数据的过程。分为三个部分:数据读取,数据整理以及数据写入。

    1、数据读取

    从csv读取读取数据,使用pandas读的read_csv函数,传入两个参数,分别是path文件路径,usecols读取的列表,返回的是dataframe格式。

    1. import pandas as pd
    2. def csv_read(path, usecols):
    3. return pd.read_csv(path, usecols=usecols, encoding="gbk")

    2、数据整理

    我需要做清除空值,替换固定值,匹配关键词等操作。

    1)清除空值很简单,按列替换空值,效率挺快。

    df.fillna(0, inplace=True)

    2)替换固定值很简单, 按列替换空值,效率挺快

    df["s_serialno"] = df["s_serialno"].str.replace("'", "")

    3)匹配关键词,由于多个关键词对多个内容,使用第一点的按列匹配就不行,我使用遍历方法

    itertuples,其他的遍历方法可参见:Python - pandas DataFrame数据的合并与拼接(merge、join、concat)_pd.merge合并后顺序-CSDN博客

     一开始我是匹配到不到关键词,就直接删除掉,测试小量数据还行,但面对几十万数据,频繁地让Dataframe删除数据,效率很低。于是作了如下改写,先将需要删作的idx保存下来,再一并删除。

    1. dropindex = []
    2. keyword= 'XXXXX'
    3. for obj in df.itertuples():
    4. idx = getattr(obj, "Index")
    5. if getattr(obj, "cnt") not in keyword.to_string():
    6. dropindex.append(idx)
    7. df.drop(dropindex, inplace=True)

    3、数据写入

    使用dataframe.to_sql方法,开始的写法,为保证数据唯一性,避免主键重复出错,使用try except方法 ,一条一条录入,若主键重复直接pass即可。小量数据测试还行,面对几十万数据,单条录入,数据库与程序的I/O效率不高,数据录入缓慢。

    1. from sqlalchemy import create_engine
    2. def mysql_engine():
    3. return create_engine("mysql+pymysql://root:10086@192.168.1.1:3306/order")
    4. def write_sql(rows):
    5. # 使用逐条插入,而不用批量插入,用try-except判断避免重复插入的异常
    6. for i in range(len(df)):
    7. try:
    8. df.iloc[i : i + 1].to_sql(
    9. name=table_name, con=mysql_engine(), if_exists="append", index=False
    10. )
    11. except Exception as e:
    12. # print(e)
    13. pass

    于是我改用另一种方法:

    使用原生sql语句,批量导入数据,使用ON DUPLICATE key UPDATE 避免主键重复出错。

    1. import pymysql
    2. def getConn():
    3. return pymysql.connect(
    4. host="192.168.1.1", user="root", password="123456", database="order"
    5. )
    6. def write_sql(rows):
    7. sql = (
    8. "insert into order.TABLE("
    9. "s_A,"
    10. "s_B"
    11. ") values(%s,%s)"
    12. "ON DUPLICATE key UPDATE s_B=values(s_B)"
    13. )
    14. conn = getConn()
    15. cur = conn.cursor()
    16. cur.executemany(sql, rows)
    17. conn.commit()
    18. cur.close()
    19. conn.close()

  • 相关阅读:
    让人头痛的大事务问题到底要如何解决?
    【数据结构】线性表(十)队列:循环队列及其基本操作(初始化、判空、判满、入队、出队、存取队首元素)
    1911 最大子序列交替和(状态机DP)(贪心)
    ABAP 报表中如何以二进制方式上传本地文件
    Android开发_记事本(1)
    Redis的list数据类型——Redis
    Java开发中对Redis的基本操作
    vue集成百度地图vue-baidu-map
    Docker目录映射
    如何利用IP定位技术进行反欺诈?
  • 原文地址:https://blog.csdn.net/qiuweifan/article/details/133484238