对于数据分析,导入数据时第一步,我们需要根据问题找到我们能够进行分析的数据,数据的来源可以是多样的,从数据库中导入,从第三方买入,自己爬虫收集等等。一般数据分为以下几种
CSV
CSV是最常见的数据存储数据的格式,每个数据以空格分开,对数据的存储几乎无上限,但是读取的效率是比较慢的。
- 使用pandas
pd.read_csv()
导入数据 - 使用一个变量对文件数据文件路径命名
Path = '/root/data/titanic.csv
在导入CSV数据的时候就可以做一些处理,将数据格式处理为符合我们进行数据分析需要的
df2 = pd.read_csv("sales_data_types.csv",
dtype = {'Customer Number': 'int'},
converters={'2016':convert_currency,
'2017': convert_currency,
'Percent Growth': convert_percent,
'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),
'Active': lambda x: True if x=='Y' else False})
convert_currency
是一个自定义函数
某些时候我们只需要导入数据的一部分可以有下面几种操作
data = pd.read_csv('某招聘网站数据.csv',usecols=['positionId','positionName','salary'])
- 只导入部分列,usercols传入一个列表参数来对列进行选择
如果事前给了一个列表,里面是需要的列名,但是也混了一些不需要的(也不再数据字段里的)可以用lambda函数
usecols = ['positionId', 'test', 'positionName', 'test1', 'salary']
data = pd.read_csv('某招聘网站数据.csv', usecols=lambda c: c in set(usecols))
上面的代码等价于下面用try和except结构进行筛选
usecols = ['positionId','test','positionName', 'test1','salary']
li = []
for i in usecols:
try:
tmp = pd.read_csv('某招聘网站数据.csv',usecols=[i])
li.append(tmp)
print(len(li))
except:
pass
data = pd.concat(li,axis=1)
data = pd.read_csv('某招聘网站数据.csv',skiprows=20)
导入数据的时候跳过前20行,和下面的等价
data4 = pd.read_csv("某招聘网站数据.csv",skiprows = [i for i in range(1,21)])
data = pd.read_csv('某招聘网站数据.csv',nrows=20)
- 导入前二十行数据
在导入数据的时候就可以对数据进行一些操作
data = pd.read_csv('某招聘网站数据.csv',dtype={'positionId':np.str,'companyId':np.str})
- 将其中几列数据类型由数值变成文本
data = pd.read_csv('某招聘网站数据.csv',na_values=['[]'])
- 指定某些的字符串为缺失值
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)
<a name="cMoed"></a>
## Excel
由于Office办公软件的普及,在企业中最常用的就是excel表格,excel表格的数据格式是xls和xlsx,excel一般用于存储非常小规模的数据比如几千行的数据,直接运用excel的图形界面对数据进行分析非常方便,但是入如果数据的规模大的时候,excel的运行速度堪忧,同时excel文件会变得非常大,不利于存储
- 使用pandas`pd.read_excel()`导入数据
- 使用一个变量对文件数据文件路径命名`Path = '/root/data/titanic.csv`
```python
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格式数据的解析工作
- 使用pandas
pd.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中
可以看到读取一个五十五万行的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语句读取数据库的数据