python 工具神器: pandas

   最近实习需要处理大量数据,数据预处理过程伴随着大量逻辑功能实现,自己写的代码往往时间代价很大,时间不等人啊,必须得快速解决数据预处理,不然老大怼着问进度,自己也着急。于是网上各种查实现某种数据预处理功能快速的方法,找来找去,最后不得不感叹。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,后面依然会用它作为数据处理的素材。

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)数据切片

猜你喜欢

转载自blog.csdn.net/zc20161202005/article/details/81702976