呓语 | 杨英明的个人博客

专注于c++、Python,欢迎交流

By

Pandas读取csv表格数据 && 存入数据库

作为一只萌新报名参加了阿里的天池大数据比赛,参加的这场比赛的题目是 预测商家未来14天的客流量 。由于第一次做ML/DM方面的比赛,所以上手需要学习不少新知识,比如读取数据这方面。

Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,经常用于数据分析和科学计算领域。

不管参加天池大数据比赛或者是Kaggle,首先要做得都是从比赛提供的数据文件中将数据提取出来,即 提取数据

为了更好的提取数据我不可避免的用到了Pandas,在这里我把用pandas提取csv表格数据的心得记录下来。

比赛地址:IJCAI-17 口碑商家客流量预测

提取过程

这一节里先不考虑导入数据库,只探讨如何用pandas提取数据。

1.数据文件

2.提取代码

#coding=utf8
import pandas

def Init():
    print '正在提取商家数据……'
    shop_info = pandas.read_csv(r'.\dataset\dataset\shop_info.txt',header=None,names=['shop_id','city_name','location_id','per_pay','score','comment_cnt','shop_level','cate_1_name','cate_2_name','cate_3_name'])
    print shop_info.head(5)

    print '正在提取支付数据……'
    user_pay = pandas.read_csv(r'.\dataset\dataset\user_pay.txt', iterator=True,header=None,names=['user_id','shop_id','time_stamp'])
    try:
        df = user_pay.get_chunk(5)
    except StopIteration:
        print "Iteration is stopped."
    print df

    print '正在提取浏览数据……'
    user_view = pandas.read_csv(r'.\dataset\dataset\user_view.txt',header=None,names=['user_id','shop_id','time_stamp'])
    print user_view.head(5)

if __name__=='__main__':
    Init()

pandas.read_csv()的参数说明:

header:指定某一行为列名,默认header=0,即指定第一行的所有元素名对应为每一列的列名。若header=None,则不指定列名行。

names:与header配合使用,若header=None,则可以使用该参数手动指定列名。

iterator:返回一个TextFileReader 对象,以便逐块处理文件。默认值为False。

3.运行结果

存入数据库

上一节探讨了如何提取数据,这一节我们探讨如何将数据导入到mysql数据库中。

观察上一节提取代码,你会发现user_pay的数据提取我使用了迭代提取的办法,这是因为user_pay的csv文件有2G大小。我使用的windows 32bit python,内存有限制,无法一次性读取这么大的数据集(会提示MemoryError)。

在这一节里,我要把数据都存入数据库,所以干脆都采用了迭代的方式,迭代的过程中执行sql将数据插入表中。

完整代码如下:

#coding=utf8
import pandas
import MySQLdb

def Init():
    # 连接数据库
    conn= MySQLdb.connect(
            host='localhost',
            port = 3306,
            user='root',
            passwd='1234',
            db ='tianchi_1',
            charset = 'utf8',       # 不声明编码导入的数据会显示出错
            )
    cur = conn.cursor()

    print '正在提取商家数据……'
    shop_info = pandas.read_csv(r'.\dataset\dataset\shop_info.txt', iterator=True,chunksize=1,header=None,names=['shop_id','city_name','location_id','per_pay','score','comment_cnt','shop_level','cate_1_name','cate_2_name','cate_3_name'])
    print '正在将数据导入到数据库……'
    for i,shop in enumerate(shop_info):
        # 用-1或者''代替空值NAN
        shop = shop.fillna({'cate_1_name':'','cate_2_name':'','cate_3_name':''})      # 替换字符串空值
        shop = shop.fillna(-1)      # 替换整数空值
        shop = shop.values[0]   # Series类型转换成列表类型
        #print shop
        sql ="insert into shop_info (`shop_id`,`city_name`,`location_id`,`per_pay`,`score`,`comment_cnt`,`shop_level`,`cate_1_name`,`cate_2_name`,`cate_3_name`) values('%d','%s','%d','%d','%d','%d','%d','%s','%s','%s')"\
              %(shop[0],shop[1],shop[2],shop[3],shop[4],shop[5],shop[6],shop[7],shop[8],shop[9])
        cur.execute(sql)
        print '%d / 2000'%(i+1)
    conn.commit()

    print '正在提取支付数据……'
    user_pay = pandas.read_csv(r'.\dataset\dataset\user_pay.txt', iterator=True,chunksize=1,header=None,names=['user_id','shop_id','time_stamp'])
    print '正在将数据导入到数据库……'
    for i,user in enumerate(user_pay):
        # 用-1代替空值NAN
        user = user.fillna(-1)      # 替换整数空值
        user = user.values[0]   # Series类型转换成列表类型
        #print user
        sql ="insert into user_pay (`user_id`,`shop_id`,`time_stamp`) values('%d','%d','%s')"\
              %(user[0],user[1],user[2])
        cur.execute(sql)
        print '%d'%(i+1)
    conn.commit()

    print '正在提取浏览数据……'
    user_view = pandas.read_csv(r'.\dataset\dataset\user_view.txt', iterator=True,chunksize=1,header=None,names=['user_id','shop_id','time_stamp'])
    print '正在将数据导入到数据库……'
    for i,user in enumerate(user_view):
        # 用-1代替空值NAN
        user = user.fillna(-1)      # 替换整数空值
        user = user.values[0]   # Series类型转换成列表类型
        #print user
        sql ="insert into user_view (`user_id`,`shop_id`,`time_stamp`) values('%d','%d','%s')"\
              %(user[0],user[1],user[2])
        cur.execute(sql)
        print '%d'%(i+1)
    conn.commit()

if __name__=='__main__':
    Init()

参考资料

pandas.read_csv参数详解

使用Python Pandas处理亿级数

【原】十分钟搞定pandas

pandas教程:[22]填充缺失值

pandas入门之查询和分析数据

原创声明

转载请注明:呓语 » Pandas读取csv表格数据 && 存入数据库