数据操做

数据操做

一 、本章学习内容:

  • 数据导入、存储
  • 数据处理

数据操做最重要的一步也是第一步就是收集数据,而收集数据的方式有不少种,第一种就是咱们已经将数据下载到了本地,在本地经过文件进行访问,第二种就是须要到网站的API处获取数据或者网页上爬取数据,还有一种可能就是你的公司里面有本身的数据库,直接访问数据库里面的数据进行分析。须要注意的是咱们不只须要将数据收集起来还要将不一样格式的数据进行整理,最后再作相应的操做。html

undefined

二 、数据导入、存储

访问数据是数据分析的所必须的第一步,只有访问到数据才能够对数据进行分析。python

2.1 文本格式

经常使用pandas解析函数:git

pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。如下github

函数 描述
read_csv 从文件、url或者文件型对象读取分割好的数据,逗号是默认分隔符
read_table 从文件、url或者文件型对象读取分割好的数据,制表符(‘\t’)是默认分隔符
read_fwf 读取定宽格式数据(无分隔符)
read_clipboard 读取剪贴板中的数据,能够看作read_table的剪贴板。再将网页转换为表格
read_excel 从Excel的XLS或者XLSX文件中读取表格数据
read_hdf 读取pandas写的HDF5文件
read_html 从HTML文件中读取全部表格数据
read_json 从json字符串中读取数据
read_pickle 从Python pickle格式中存储的任意对象
read_msgpack 二进制格式编码的pandas数据
read_sas 读取存储于sas系统自定义存储格式的SAS数据集
read_stata 读取Stata文件格式的数据集
read_feather 读取Feather二进制文件格式
read_sql 将SQL查询的结果(SQLAlchemy)读取为pandas的DataFrame

undefined

咱们能够经过上表对这些解析函数有一个简单了解,其中read_csv和read_table是之后用得最多的两个方法,接下来咱们主要就这两个方法测试。web

2.1.1 read_csv

csv文件就是一个以逗号分隔字段的纯文本文件,用于测试的文件是自己是一个Excel文件,须要修改一下扩展名,可是简单的修改后缀名不行,还须要将字符编码改变为utf-8,由于默认的是ASCII,不然是会报错的。而后就能够经过read_csv将它读入到一个DataFrame:正则表达式

import pandas as pd

df = pd.read_csv("E:/Test/test3.csv")
df
    name    age sex
0   佩奇  18  女
1   乔治  19  男

数据处理

注意:sql

到这里可能就会有些人有疑问了,为何个人文件路径不对啊,那是由于在咱们这个方法当中的路径当它往左斜的时候须要用双斜杠,不然就要使用右斜杠数据库

2.1.2 read_table

还可使用read_table,而且指定分隔符json

import pandas as pd
df = pd.read_csv("E:/Test/test3.csv")
df

name    age sex
0   佩奇  18  女
1   乔治  19  男

数据处理_tabl

若是不指定分隔符,它的数据之间会有逗号。api

以上只是简单的读取操做

指定列名

pandas能够帮助咱们自动分配列名,也能够本身指定列名
默认列名

import pandas as pd
df = pd.read_csv("E:/Test/test.csv",header=None)
df
    0   1   2   3   4   5
0   a   b   c   d   e   f
1   g   h   i   j   k   l
2   m   n   o   p   q   r

recv_table2

指定列名

import pandas as pd
df = pd.read_csv("E:/Test/test.csv",names=['数','据','分','析','真','好','玩'])
df

recv_table3

具体还有那些参数,经过表格展现一下,这些参数是read_csv和read_table共有的

参数 描述
path 代表文件系统位置的字符串、URL或者文件型对象
sep或delimiter 用于分隔每行字段的字符序列或正则表达式
header 用做列名的行号,默认是0(第一行),若是没有为None
names 结果的列名列表,和header=None一块儿用
skiprows 从文件开头起,须要跳过的行数或者行号列表
na_values 用NA替换的值序列(能够用来处理缺失值)
data_parser 用于解析日期的函数
nrows 从文件开头处读取的行数
chunksize 用于设置迭代的块大小
encoding 设置文本编码

分块读取文件

刚才咱们读取文件是把整个文件都读取出来了,那接下来咱们就尝试分块读取文本文件,由于不是全部的文件内容都只有这么少,咱们在实际运用当中会须要读取文件的一个小片断。

读取大文件的时候能够添加一个参数使得显示的内容更加紧凑

import pandas as pd
pd.options.display.max_rows = 3
df = pd.read_csv("E:/Test/test.csv")
df

undefined

还能够经过上面表格中提到的 nrows 参数选择只读取其中的几行。

2.2 二进制

2.2.1 pickle

在Python中有一个自带的序列化模块pickle,它是进行二进制格式操做存储数据最高效、最方便的方式之一。在pandas中有一个to_pickle方法能够将数据以pickle格式写入硬盘

import pandas as pd
df = pd.read_csv("E:/Test/test_j.csv")
df.to_pickle("E:/Test/df_pickle")

运行完以后会发现没反应,可是能够打开你存储的文件夹会发现这个pickle文件已经存到里面了。

虽说这种方式很是方便,可是却很难保证格式的长期有效性。一个今天被pickle化的对象可能明天会由于库的新版本而没法反序列化.在pandas当中还支持其余的二进制格式。接着往下看

2.2.2 HDF5

HDF5主要用于存储大量的科学数组数据。以C库的形式提供,而且有许多其余语言的接口,例如:JAVA、Julia,固然还有咱们的Python。HDF5中的HDF表明分层数据格式,每一个HDF5文件能够存储多个数据集而且支持元数据

pandas.read_hdf函数是使用HDF5格式的一个快捷方法

import pandas as pd
import numpy as np
frame = pd.DataFrame({'a':np.random.randn(100)})

frame.to_hdf("E:/Test/mydata.h5",'obj3',format='table')
pd.read_hdf('E:/Test/mydata.h5','obj3',where=['index < 5'])

undefined

undefined

2.3 Web API

如今不少网站都有公开的API,经过JSON或者其余什么格式提供数据服务。那接下来,咱们就经过Python的requests模块访问Web API。

import requests
import pandas as pd
url = "https://api.github.com/repos/pandas-dev/pandas/issues"
resp = requests.get(url)
data = resp.json()
# 由于data中的每一个元素都是一个字典,能够直接将data传给DataFrame,而且将其中本身喜欢的字段展现出来
issues = pd.DataFrame(data,columns=['number','title','labels','state'])
issues

undefined

三 、数据处理

通过前面的了解,对于数据的导入以及存储已经有了一个简单的了解,可是在实际的工做状况当中,拿到的数据不可能都是预想的格式,因此说,就须要经过一些文本处理工具将这种特殊数据从一种形式转换为另外一种能够接受的形式,正好在Python的pandas库当中就为咱们提供了一个高级、灵活和快速的工具集,将数据转换成想要的格式。

undefined

3.1 处理缺失值

缺失数据在数据分析的应用当中是很常见的,pandas的目标之一就是尽量的无影响的处理缺失值。在pandas当中使用浮点值NaN(Not a Number来表是缺失值)。处理缺失值的最多见的两种的方法:第一个就是直接将那个值丢弃,第二种方式就是补全缺失值。

属性 描述
dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤。
fillna 用指定值或插值方法(如ffill或bfill)填充缺失数据
isnull 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA
notnull isnull的否认式

3.2 过滤缺失值

data = pd.Series(['pandas','numpy',np.nan,'matplotlib'])
-------------------------------------------
data.isnull()
运行结果:
0    False
1    False
2     True
3    False
dtype: bool    # 返回一个布尔值数组
-------------------------------------------
data[0] = None  # python中内置的None值在对象数组种也能够做为NA
data.notnull()
运行结果:
0    False
1     True
2    False
3     True
dtype: bool
-------------------------------------------
data_1 = pd.Series([1,np.nan,3,np.nan,5.5,9])
data_1.dropna()  # 丢弃任何含有缺失值的行
运行结果:
0    1.0
2    3.0
4    5.5
5    9.0
dtype: float64
# data_1[data_1.notnull()]等价于data_1.dropna()

以上都是对Series这种一维数组的缺失值处理,若是对于DataFrame这种二维数组的处理就会出现一些问题。

df = pd.DataFrame([[1,3,5,7,9],[2,4,6,np.nan],[1.5,5.,6.3,np.nan],[4.,2.3,np.nan,8,9.],[np.nan,np.nan,np.nan,np.nan,np.nan]])
df
运行结果:
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 9.0
1   2.0 4.0 6.0 NaN NaN
2   1.5 5.0 6.3 NaN NaN
3   4.0 2.3 NaN 8.0 9.0
4   NaN NaN NaN NaN NaN
-------------------------------------------
cleaned = df.dropna()
cleaned
运行结果:
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 9.0
# 全部带有缺失值的行全被丢弃了

对于这种状况能够经过传递参数来解决:

df.dropna(how="all")  # 丢弃全为缺失值的行
运行结果:
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 9.0
1   2.0 4.0 6.0 NaN NaN
2   1.5 5.0 6.3 NaN NaN
3   4.0 2.3 NaN 8.0 9.0
-------------------------------------------
df[4] = np.nan
df.dropna(axis=1,how="all") # 丢弃全为缺失值的列
运行结果:
    0   1   2   3
0   1.0 3.0 5.0 7.0
1   2.0 4.0 6.0 NaN
2   1.5 5.0 6.3 NaN
3   4.0 2.3 NaN 8.0
4   NaN NaN NaN NaN
-------------------------------------------

3.3 补全缺失值

有时候在操做数据的时候可能不想过滤掉缺失数据,由于有可能会丢弃和他有关的其余数据,而是但愿经过一些其余方式来填补那些缺失的地方。fillna方法是处理这些问题最主要的方法。

df.fillna(0)  # 替换缺失值为0
运行结果:
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 0.0
1   2.0 4.0 6.0 0.0 0.0
2   1.5 5.0 6.3 0.0 0.0
3   4.0 2.3 0.0 8.0 0.0
4   0.0 0.0 0.0 0.0 0.0
-------------------------------------------
df.fillna({1:0.5,2:0})  # 对不一样的列填充不一样的值
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 NaN
1   2.0 4.0 6.0 NaN NaN
2   1.5 5.0 6.3 NaN NaN
3   4.0 2.3 0.0 8.0 NaN
4   NaN 0.5 0.0 NaN NaN
-------------------------------------------
_ = df.fillna(0,inplace=True)
df
运行结果:
    0   1   2   3   4
0   1.0 3.0 5.0 7.0 0.0
1   2.0 4.0 6.0 0.0 0.0
2   1.5 5.0 6.3 0.0 0.0
3   4.0 2.3 0.0 8.0 0.0
4   0.0 0.0 0.0 0.0 0.0

使用fillna还能够进行插值

df1 = pd.DataFrame(np.random.randn(6,3))
df1
运行结果:
    0           1           2
0   0.475304    -1.274166   1.467016
1   -0.113910   0.935197    -1.008954
2   0.218006    0.209405    0.224217
3   1.878587    0.492774    -1.391237
4   -0.702284   0.863064    0.939069
5   -1.450531   0.994467    0.265843
# 一组数据数
-------------------------------------------
df1.iloc[2:,1] = np.nan  # 将第二列第三行之后的数据都转换为缺失值
df1.iloc[4:,2] = np.nan  # 将第三列第五行之后的数据都转换为缺失值
运行结果:
    0           1           2
0   1.073202    0.644249    -0.089127
1   -0.028500   0.479373    -0.271212
2   1.575710    NaN         -0.119795
3   -0.202480   NaN         0.385250
4   -1.090317   NaN         NaN
5   0.985767    NaN         NaN
-------------------------------------------
df1.fillna(method='ffill')
运行结果:
    0           1           2
0   1.073202    0.644249    -0.089127
1   -0.028500   0.479373    -0.271212
2   1.575710    0.479373    -0.119795
3   -0.202480   0.479373    0.385250
4   -1.090317   0.479373    0.385250
5   0.985767    0.479373    0.385250
# 参数limit还能够设置替换的行
参数 说明
value 用于填充缺失值的标量值或字典对象
method 插值方式。若是函数调用时未指定其余参数的话,默认为“ffill”
axis 待填充的轴,默认axis=0
inplace 修改调用者对象而不产生副本
limit 能够连续填充的最大数量

undefined

四 、数据转换

4.1 删除重复值

data = pd.DataFrame({"k1":['one','two'] * 3 + ['two'],
                    "k2":[1,1,2,3,3,4,4]})
data
运行结果:
    k1  k2
0   one 1
1   two 1
2   one 2
3   two 3
4   one 3
5   two 4
6   two 4
-----------------------------------------------
data.duplicated()  # 返回一个布尔型Series,表示各行是不是重复行
0    False
1    False
2    False
3    False
4    False
5    False
6     True
dtype: bool
-----------------------------------------------
data.drop_duplicates()  # 返回一个DataFrame,重复的数组会标为False
    k1  k2
0   one 1
1   two 1
2   one 2
3   two 3
4   one 3
5   two 4   
# 重复的行被删除了
-----------------------------------------------

以上方法是针对所有列,还能够经过传入参数对部分指定列进行重复项判断。

data['v1'] = range(7)  # 添加一个v1列
data.drop_duplicates(['k1','k2'])  # 能够传入一个列表,指定列,默认保留第一个出现的值组合
    k1  k2  v1
0   one 1   0
1   two 1   1
2   one 2   2
3   two 3   3
4   one 3   4
5   two 4   5
-----------------------------------------------
data.drop_duplicates(['k1','k2'],keep='last')  # 默认保留最后一个出现的值组合
    k1  k2  v1
0   one 1   0
1   two 1   1
2   one 2   2
3   two 3   3
4   one 3   4
6   two 4   6

4.2 使用函数或映射进行数据转换

data = pd.DataFrame({"goods":['Iphone','HUAWEI','SAMSUNG','MI','OPPO'], "price":[6000,4000,5000,3000,3000]})
data
运行结果:
    goods   price
0   Iphone  6000
1   HUAWEI  4000
2   SAMSUNG 5000
3   MI      3000
4   OPPO    3000

如今有这样一组数据,假设如今须要加上一列数据。将每样商品的出产国家加上

# 先定义一个不一样商品到产地的映射
produce_nation = {
    "iphone":'America',
    "huawei":'China',
    "samsung":'Korea',
    "mi":'China',
    "oppo":'China'
}
# 由于定义的商品全是大写,须要所有转换为小写
lower_cased = data['goods'].str.lower()

# 经过map映射添加一列出产国家数据
data['nation'] =  lower_cased.map(produce_nation)
运行结果:
    goods   price   nation
0   Iphone  6000    America
1   HUAWEI  4000    China
2   SAMSUNG 5000    Korea
3   MI      3000    China
4   OPPO    3000    China

也能够经过一个函数完成这些工做:

data['goods'].map(lambda x:produce_nation[x.lower()])
运行结果:
0    America
1      China
2      Korea
3      China
4      China
Name: goods, dtype: object

4.3 替换值

利用fillna()方法填充缺失数据是值替换的一种特殊状况。接下来可使用replace方法进行替换值操做。

data = pd.Series([1., -999., 2., -999., -1000., 3.])
data   # 生成一个Series数组
运行结果:
0       1.0
1    -999.0
2       2.0
3    -999.0
4   -1000.0
5       3.0
dtype: float64
----------------------------------------------
# 其中-999多是缺失值的某一标识,须要使用NA替代这些值
一、
data.replace(-999, np.nan)  # 经过replace产生一个新的Series,除非传入inplace=True
运行结果:
0       1.0
1       NaN
2       2.0
3       NaN
4   -1000.0
5       3.0
dtype: float64
二、
data.replace([-999, -1000], np.nan)  # 一次性替换多个值
三、
data.replace([-999, -1000], [np.nan, 0])  # 替换不一样的值,经过列表
四、
data.replace({-999: np.nan, -1000: 0})  # 替换不一样的值,经过字典

undefined

相关文章
相关标签/搜索