对于数据分析,导入数据时第一步,我们需要根据问题找到我们能够进行分析的数据,数据的来源可以是多样的,从数据库中导入,从第三方买入,自己爬虫收集等等。一般数据分为以下几种

CSV

CSV是最常见的数据存储数据的格式,每个数据以空格分开,对数据的存储几乎无上限,但是读取的效率是比较慢的。

  • 使用pandaspd.read_csv()导入数据
  • 使用一个变量对文件数据文件路径命名Path = '/root/data/titanic.csv

在导入CSV数据的时候就可以做一些处理,将数据格式处理为符合我们进行数据分析需要的

  1. df2 = pd.read_csv("sales_data_types.csv",
  2. dtype = {'Customer Number': 'int'},
  3. converters={'2016':convert_currency,
  4. '2017': convert_currency,
  5. 'Percent Growth': convert_percent,
  6. 'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),
  7. 'Active': lambda x: True if x=='Y' else False})

convert_currency是一个自定义函数

某些时候我们只需要导入数据的一部分可以有下面几种操作

  1. data = pd.read_csv('某招聘网站数据.csv',usecols=['positionId','positionName','salary'])
  • 只导入部分列,usercols传入一个列表参数来对列进行选择

如果事前给了一个列表,里面是需要的列名,但是也混了一些不需要的(也不再数据字段里的)可以用lambda函数

  1. usecols = ['positionId', 'test', 'positionName', 'test1', 'salary']
  2. data = pd.read_csv('某招聘网站数据.csv', usecols=lambda c: c in set(usecols))

上面的代码等价于下面用try和except结构进行筛选

  1. usecols = ['positionId','test','positionName', 'test1','salary']
  2. li = []
  3. for i in usecols:
  4. try:
  5. tmp = pd.read_csv('某招聘网站数据.csv',usecols=[i])
  6. li.append(tmp)
  7. print(len(li))
  8. except:
  9. pass
  10. data = pd.concat(li,axis=1)
  1. data = pd.read_csv('某招聘网站数据.csv',skiprows=20)

导入数据的时候跳过前20行,和下面的等价

  1. data4 = pd.read_csv("某招聘网站数据.csv",skiprows = [i for i in range(1,21)])
  1. data = pd.read_csv('某招聘网站数据.csv',nrows=20)
  • 导入前二十行数据

在导入数据的时候就可以对数据进行一些操作

  1. data = pd.read_csv('某招聘网站数据.csv',dtype={'positionId':np.str,'companyId':np.str})
  • 将其中几列数据类型由数值变成文本
  1. data = pd.read_csv('某招聘网站数据.csv',na_values=['[]'])
  • 指定某些的字符串为缺失值
  1. data = pd.read_csv('某招聘网站数据.csv',index_col='positionId')
  • 将某列作为数据帧的索引

    导入一个文件夹中的所有文件

    ```python import os path = ‘demodata/‘ filesnames = os.listdir(path) filesnames = [f for f in filesnames if f.lower().endswith(“.xlsx”)] df_list = [] for filename in filesnames: df_list.append(pd.read_excel(path + filename))

df = pd.concat(df_list)

  1. <a name="cMoed"></a>
  2. ## Excel
  3. 由于Office办公软件的普及,在企业中最常用的就是excel表格,excel表格的数据格式是xls和xlsx,excel一般用于存储非常小规模的数据比如几千行的数据,直接运用excel的图形界面对数据进行分析非常方便,但是入如果数据的规模大的时候,excel的运行速度堪忧,同时excel文件会变得非常大,不利于存储
  4. - 使用pandas`pd.read_excel()`导入数据
  5. - 使用一个变量对文件数据文件路径命名`Path = '/root/data/titanic.csv`
  6. ```python
  7. df = pd.read_excel("readexcel.xlsx",sheet_name=1)
  • sheet_name=正整数值,等于0表示读取第一个sheet表,等于1表示读取第二个sheet表,以此类推下去。
  • sheet_name="sheet"名称”,我们可以利用每张sheet表的名称,读取到不同的sheet表,更方便灵活。

    注意:如果不指定该参数,那么默认读取的是第一个sheet表。

JSON

JSON也是用常用的数据格式,由JavaScript发展而来,在网站上面常用,进行爬虫的时候会经常碰到对json格式数据的解析工作

  • 使用pandaspd.read_json()导入数据
  • 下面的代码使用python的标准库json读取json格式的数据
    data  = [] #初始化  
    #使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常  
    with open("/work/arxiv-metadata-oai-2019.json",'r') as f:   
      for line in f:   
          data.append(json.loads(line))  
      data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析  
    data.shape #显示数据大小
    

HDF5

HDF5是一种新型的数据存储格式,对于大量数据读写有很好的效果,比如一个有55万行,30列的excel文件,直接用read_excel进行读取需要5~10分钟,取决于电脑内存的不同,但是使用hdf5格式,可以将时间压缩到1分钟以内。是惊人的提升,但是HDF5也有缺点,就是存储的体积比较大,要超过正常的csv和xlsx文件。

import pandas as pd

data = pd.read_excel("C:\\Users\\Administrator\\Desktop\\test.xlsx")
data.to_hdf("C:\\Users\\Administrator\\Desktop\\test.h5",key="data",mode='w')

df = read_hdf("C:\\Users\\Administrator\\Desktop\\test.h5")
  • 这里将excel中的数据用pandas进行读取,并存入hdf5格式的保存下来
  • 使用to_hdf将dataframe输出到hdf5格式
  • 由于hdf5是一种类似于文件夹的层级结构,需要指定一个key,这里就使用我们给dataframe命名的变量名就可以了,mode这里选择w是因为之前没有hdf5文件,这个模式下可以新建一个hdf5文件
  • 使用read_hdf()将hdf5格式的数据读取到dataframe中

image.png
可以看到读取一个五十五万行的hdf5格式文件仅仅需要1.9秒!!!

SQL

除了中文件中直接导入数据,我们也可以从数据库中导入数据到pandas中,这里示范导入postgresql的数据

import psycopg2
import pandas as pd

postgres_host = "localhost"           # 数据库地址
postgres_port = "5432"                # 数据库端口
postgres_user = "postgres"            # 数据库用户名
postgres_password = "123456"          # 数据库密码
postgres_datebase = "work"            # 数据库名字
postgres_table1 = "病案数据"           #数据库中的表的名字


conn_string = "host=" + postgres_host + " port=" + postgres_port + " dbname=" + postgres_datebase + \
                  " user=" + postgres_user + " password=" + postgres_password
conn = psycopg2.connect(conn_string)

sql_command1 = "select * from {}".format(postgres_table1)

data = pd.read_sql(sql_command1, conn)
  • 这里psycopg2是用于连接python和pgsql的库
  • 需要定义一个sql语句,燃火pd.read_sql()可以通过sql语句读取数据库的数据