最近实习需要处理大量数据,数据预处理过程伴随着大量逻辑功能实现,自己写的代码往往时间代价很大,时间不等人啊,必须得快速解决数据预处理,不然老大怼着问进度,自己也着急。于是网上各种查实现某种数据预处理功能快速的方法,找来找去,最后不得不感叹。pandas真的是个神器。
pandas基础内容很多,就不详细说了。在此仅仅介绍一下工程上实用的小技巧:
a)文件读写
b)数据处理
一、 文件读写
pandas 提供了一些读取表格形式文件生成DataFrame对象的函数。数据工程上最常用的数据文件格式分别为 excel , cvs , json , txt四类文件。也就是说不论文件是哪一种后缀名,内容必须是表格形式。
(1)读取文件数据
- pd.read_csv(filename):从CSV文件导入数据
- pd.read_table(filename):从限定分隔符的文本文件导入数据
- pd.read_excel(filename):从Excel文件导入数据
- pd.read_json(json_string):从JSON格式的字符串导入数据
- pd.DataFrame(dict):从字典对象导入数据
如表格所示,本次示例的表格为test.xlsx,后面依然会用它作为数据处理的素材。
ID | Name | Age | Class | Grade | Honor |
20181414 | 张一 | 16 | 1 | 90 | 优秀学生干部 |
20181415 | 红二 | 16 | 1 | 85 | |
20181417 | 李三 | 17 | 3 | 87 | 优秀学生代表 |
20181425 | 陈四 | 17 | 2 | 86 | |
20181433 | 吴五 | 18 | 3 | 90 | 学习标兵 |
20181432 | 黑六 | 18 | 2 | 87 | |
20181428 | 霍七 | 15 | 3 | 85 | |
20181427 | 齐八 | 16 | 3 | 86 | 优秀 |
20181437 | 解九 | 15 | 2 | 89 | |
20181429 | 杜十 | 18 | 1 | 90 | 学习标兵 |
# 函数调用方式及其参数
pd.read_excel(io, sheetname=0, header=0,encoding ='')
'''
该函数主要的参数为io、sheetname、header、names、encoding。
io:excel文件,可以是文件路径、文件网址、file-like对象、xlrd workbook;
sheetname:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型,返回字典{'key':'sheet'})、none(返回字典,全部sheet);
header:指定数据表的表头,header = 0表示数据第一行为属性,不能作为数据读入。header = None表示第一行也被读入
encoding:关键字参数,指定以何种编码读取。
该函数返回pandas中的DataFrame或dict of DataFrame对象,利用DataFrame的相关操作即可读取相应的数据。
'''
根据函数可以读取表格数据,此时有:
import pandas as pd
data = pd.read_excel('./test.xlsx',sheetname= None,header = 0)
print(data)
结果为:
{'class_one':
ID Name Age Class Grade Honor
0 20181414 张一 16 1 90 优秀学生干部
1 20181415 红二 16 1 85 NaN
2 20181417 李三 17 3 87 优秀学生代表
3 20181425 陈四 17 2 86 NaN
4 20181433 吴五 18 3 90 学习标兵
5 20181432 黑六 18 2 87 NaN
6 20181428 霍七 15 3 85 NaN
7 20181427 齐八 16 3 86 优秀
8 20181437 解九 15 2 89 NaN
9 20181429 杜十 18 1 90 学习标兵
}
可见直接读取数据之后,空缺值会自动用NaN填充。而且这些数据在sheet名为‘class_one’的表格下。若指定sheetname='class_one',则输出结果只有数据内容。若header = None会发生什么情况呢:
0 1 2 3 4 5
0 ID Name Age Class Grade Honor
1 20181414 张一 16 1 90 优秀学生干部
2 20181415 红二 16 1 85 NaN
3 20181417 李三 17 3 87 优秀学生代表
4 20181425 陈四 17 2 86 NaN
5 20181433 吴五 18 3 90 学习标兵
6 20181432 黑六 18 2 87 NaN
7 20181428 霍七 15 3 85 NaN
8 20181427 齐八 16 3 86 优秀
9 20181437 解九 15 2 89 NaN
10 20181429 杜十 18 1 90 学习标兵
此时第一行属性行也作为数据被读入进来,这样就造成错误了。
CVS文件读取方式与excel文件读取一致,只不过使用的函数为pd.read_cvs(). 读取 json 文件的方式就有一些不一样了,并不能直接对 json 文件进行读取,而是读取 json 格式的字符串内容。
import pandas as pd
data = open('file.json').read() # 生成json格式的字符串
data = pd.read_json(json_str,typ='series') # 将json格式字符串转成series格式,tpy还可以定义为frame,默认为frame。
读取txt文件的要求是文本内容必须是表格形式。
扫描二维码关注公众号,回复:
2800626 查看本文章
import pandas as pd
# 方法一
data = pd.read_table('Z:/test.txt',header=None,encoding='gb2312',delim_whitespace=True,index_col=0)
# header=None: 没有每列的属性名,none表示第一行也要读取,0表示第一行不读取
# encoding='gb2312': 其他编码中文显示错误
# delim_whitespace=True: 用空格来分隔每行的数据
# index_col=0: 设置第1列数据作为index
# 方法二
df = pd.read_table('file.txt',sep=' ',encoding='utf-8')
# sep = ' ',表示文本中同一行元素之间以空格隔开,可以替换成其他字符
(2)数据写入文件
- df.to_csv(filename):导出数据到CSV文件
- df.to_excel(filename):导出数据到Excel文件
- df.to_json(filename):以Json格式导出数据到文本文件
不同文件写入方式基本相同,都需要预先创建文件对象,再将数据写入对象中
import pandas as pd
data = pd.read_excel('./test.xlsx',sheetname= 'class_one') # 获取数据
print(data)
writer = pd.ExcelWriter('./out.xlsx') # 创建一个文件对象
data.to_excel(writer,'sheet1') # 将数据写入文件对象,指定到'sheet1'中
二、数据处理
(1)生成数据对象
- pd.DataFrame():创建20行5列的随机数组成的DataFrame对象
- pd.Series():从可迭代对象my_list创建一个Series对象
import pandas as pd
import numpy as np
data1 = pd.DataFrame(np.random.rand(6,6))
print(data1)
>>>
0 1 2 3 4 5
0 0.543654 0.037334 0.773529 0.258297 0.919448 0.818290
1 0.379388 0.843063 0.747558 0.269459 0.029360 0.579104
2 0.224895 0.049106 0.925277 0.300890 0.177321 0.759273
3 0.131200 0.693778 0.126493 0.301977 0.814757 0.025051
4 0.544993 0.032358 0.982544 0.268643 0.768851 0.775182
5 0.500988 0.810403 0.402091 0.008243 0.856821 0.508685
list = [1,2,3,4,5]
data2 = pd.Series(list)
print(data2)
>>>
0 1
1 2
2 3
3 4
4 5
dtype: int64
(2) 数据查看
- df.head(n):查看DataFrame对象的前n行
- df.tail(n):查看DataFrame对象的最后n行
- df.shape():查看行数和列数
- df.info():查看索引、数据类型和内存信息
- df.describe():查看数值型列的汇总统计
- s.value_counts(dropna=False):查看Series对象的唯一值和计数
- df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
import pandas as pd
import numpy as np
data1 = pd.read_excel('./test.xlsx',sheetname='class_one',header=0)
print(type(data1))
>>>
<class 'pandas.core.frame.DataFrame'>
print(data1)
>>>
ID Name Age Class Grade Honor
0 20181414 张一 16 1 90 优秀学生干部
1 20181415 红二 16 1 85 NaN
2 20181417 李三 17 3 87 优秀学生代表
3 20181425 陈四 17 2 86 NaN
4 20181433 吴五 18 3 90 学习标兵
5 20181432 黑六 18 2 87 NaN
6 20181428 霍七 15 3 85 NaN
7 20181427 齐八 16 3 86 优秀
8 20181437 解九 15 2 89 NaN
9 20181429 杜十 18 1 90 学习标兵
print(data1.head(1)) # 获取前N行信息
>>>
ID Name Age Class Grade Honor
0 20181414 张一 16 1 90 优秀学生干部
print(data1.tail(1)) # 获取后N行信息
>>>
ID Name Age Class Grade Honor
9 20181429 杜十 18 1 90 学习标兵
print(data1.shape) # 获取dataframe的行数与列数,返回一个数组,第一个元素为行数,第二个元素为列数
>>>
(10, 6)
print(data1.describe()) # 返回dataframe各列的统计信息
>>>
ID Age Class Grade
count 1.000000e+01 10.000000 10.000000 10.000000
mean 2.018143e+07 16.600000 2.100000 87.500000
std 7.930952e+00 1.173788 0.875595 2.068279
min 2.018141e+07 15.000000 1.000000 85.000000
25% 2.018142e+07 16.000000 1.250000 86.000000
50% 2.018143e+07 16.500000 2.000000 87.000000
75% 2.018143e+07 17.750000 3.000000 89.750000
max 2.018144e+07 18.000000 3.000000 90.000000
(3)数据切片