今天在使用python日常数据运营分析中,发现有几个问题需要进行深入的挖掘,现在与大家共同分享解决办法,望与大家共勉。
实际数据的分析过程如下:
1、数据的读入
数据分析首先要确定目标,目标确定后完成数据的读入,数据读入不外乎读入CSV、XLS、数据库等格式的数据,鉴于目前分析的主要为CSV格式数据,其读入过程如下:
(1)、导入必要的库,通俗来说就是模块
import pandas as pdimport numpy as npimport matplotlib.pylab as pltimport os
(2)、路径的设置
如果文件存放的路径与程序属于同一路径,可以直接导入,如果文件单独存放在某个文件夹中,则最好使用绝对路径的方式导入。
os.chdir(r"D:\\7月工单数据")path=os.getcwd()listd=os.listdir(path)print(listd)
可以看出os.listdir()函数返回的是一个列表对象,而不是一个迭代器。以前一直使用pathlib模块去进行路径及文件的处理,后期发现pathlib不支撑路径的修改,后期就放弃了,大家如果有好的路径处理模块可以介绍一下。
(3)、文件的导入
我们想导入所有的csv格式的文件并且完成文件的合并。
导入文件通常使用pd.read_csv()
但是对于数据量较大,格式不明显的数据来说读入很容易出现问题。
DtypeWarning: Columns (1,5,7,16,......) have mixed types. Specify dtype option on import or set low_memory=False
low_memory是怎么解决问题的?
pandas读取csv文件默认是按块读取的,即不一次性全部读取;另外pandas对数据的类型是完全靠猜的,所以pandas每读取一块数据就对csv字段的数据类型进行猜一次,所以有可能pandas在读取不同块时对同一字段的数据类型猜测结果不一致。
low_memory=False 参数设置后,pandas会一次性读取csv中的所有数据,然后对字段的数据类型进行唯一的一次猜测。这样就不会导致同一字段的Mixed types问题了。
但是这种方式真的非常不好,一旦csv文件过大,就会内存溢出;
解决方案
# 1.设置read_csv的dtype参数,指定字段的数据类型pd.read_csv(sio, dtype={"user_id": int, "username": object})# 2.设置read_csv的low_memory参数为False pd.read_csv(sio, low_memory=False})
一般建议使用第一种方案,但是第二种方案较为简单,如果电脑内存不溢出的情况下可以使用。
接下来说一下合并的问题,合并两个DataFrame有两种方案:
- append方法
大家日常分析当中可能容易忘记append方法,但是对于迭代来说append方法最适合使用。
for i in os.listdir(path): data =pd.read_csv(i,encoding='gbk',low_memory=False) data=data.append(data)
- concat方法
concat方法在DataFrame很隆重的介绍过,但是对于迭代合并很少使用,日常中主要用来合并两个或者多个已知的DataFrame表。但是我们忘了python的最大特点就是简洁,列表推导式可以用来解决这个问题。
data=pd.concat([pd.read_csv(listd[0],encoding='gbk',low_memory=False) for i in os.listdir(path)],ignore_index=True)
一行代码搞定,是不是很酷。
望本次的分享能够帮助到大家的日常学习、工作。
下期见!!!!