今天在使用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)

java读取csv文件存入数据库 java csv导入_数据

可以看出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)

一行代码搞定,是不是很酷。

望本次的分享能够帮助到大家的日常学习、工作。

下期见!!!!