在pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame。Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其可通过索引标签的方式获取数据,还具有索引的自动对齐功能;DataFrame类似于numpy中的二维数组,同样可以通用numpy数组的函数和方法,而且还具有其他灵活应用。
一、首先是引入pandas和numpy,这是经常配合使用的两个包,pandas依赖于numpy,引入以后我们可以直接使用np/pd来表示这个两个模块。
In [1]: import numpy as np In [2]: import pandas as pd1)通过二维数组创建数据框,我们看一下如何创建一个6X4的数据:randn函数用于创建随机数,参数表示行数和列数,dates创建的索引列。
In [3]: dates = pd.date_range('20170808',periods=6) In [4]: dates Out[4]: DatetimeIndex(['2017-08-08', '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-12', '2017-08-13'], dtype='datetime64[ns]', freq='D') In [5]: df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD')) In [6]: df Out[6]: A B C D 2017-08-08 -0.251957 1.408053 -0.085674 0.365377 2017-08-09 -0.141047 0.445702 -0.560573 0.251600 2017-08-10 -0.218148 1.619402 -1.799525 -0.697128 2017-08-11 -0.542612 -1.401814 -0.158879 0.969136 2017-08-12 0.268779 -1.376531 0.950630 -1.041401 2017-08-13 0.488717 -0.267509 0.112117 -1.166227 2) 通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:索引是自动创建的整数
In [7]: df1 = pd.DataFrame({'姓名':["李小强","孙三","王玲","刘老四"], ...: ...: '入学日期':pd.Timestamp('20170901'), ...: ...: '性别':["男","男","女","男"], ...: ...: '年龄':pd.Series([15,16,13,18],dtype='int32'), ...: ...: '排名':np.array([1,3,2,4],dtype='float32'), ...: ...: '是否':'yes'}) In [8]: df1 Out[8]: 入学日期 姓名 年龄 性别 排名 是否 0 2017-09-01 李小强 15 男 1.0 yes 1 2017-09-01 孙三 16 男 3.0 yes 2 2017-09-01 王玲 13 女 2.0 yes 3 2017-09-01 刘老四 18 男 4.0 yes 3)读取外部文件csv,excel,txt
In [9]: df2 = pd.read_csv("/home/soft/st.csv",encoding='gbk') In [10]: df2 Out[10]: 姓名 入学日期 性别 年龄 排名 是否 0 李小强 2017-9-1 男 15 1 yes 1 孙三 2017-9-1 男 16 3 yes 2 王玲 2017-9-1 女 13 2 yes 3 刘老四 2017-9-1 男 18 4 yes 注意:有一个编码问题。encoding='gbk'
读取excel文件,文件里有两个表。
In [11]: df3 = pd.read_excel("/home/soft/st.xlsx",sheetname=[0,1],skiprows=[0]) In [12]: df3 Out[12]: OrderedDict([(0, 孙小强 2017-09-01 00:00:00 男 25 4 no 0 李小红 2017-09-01 女 16 1 no 1 张爱玲 2017-09-01 女 23 3 no 2 王老五 2017-09-01 男 19 2 no), (1, 孙强 2007-09-01 00:00:00 男 125 4 yes 0 李红 2007-09-01 女 216 1 no 1 张玲 2007-09-01 女 223 3 yes 2 王五 2007-09-01 男 319 2 no)]) #sheetname指定为读取几个sheet,sheet数目从0开始
#skiprows=[0]代表读取跳过的行数第0行,不写代表不跳过标题
读取txt文件
In [13]: df4 = pd.read_table("/home/soft/st.txt",encoding='gbk',sep=',',index_col=1) In [14]: df4 Out[14]: 姓名 性别 年龄 排名 是否 入学日期 2017-9-1 李小强 男 15 1 yes 2017-9-1 孙三 男 16 3 yes 2017-9-1 王玲 女 13 2 yes 2017-9-1 刘老四 男 18 4 yes #index_col=1:设置第2列数据作为index
#sep=','以,为分隔符。
#header=None:没有每列的column name,可以自己设定
二、数据的查看
1.使用dtypes来查看各行的数据格式
In [15]: df1.dtypes Out[15]: 入学日期 datetime64[ns] 姓名 object 年龄 int32 性别 object 排名 float32 是否 object dtype: object 2.使用head查看前几行数据(默认是前5行),使用tail查看后5行数据
In [16]: df.head(3) Out[16]: A B C D 2017-08-08 -0.251957 1.408053 -0.085674 0.365377 2017-08-09 -0.141047 0.445702 -0.560573 0.251600 2017-08-10 -0.218148 1.619402 -1.799525 -0.697128 In [17]: df1.tail(2) Out[17]: 入学日期 姓名 年龄 性别 排名 是否 2 2017-09-01 王玲 13 女 2.0 yes 3 2017-09-01 刘老四 18 男 4.0 yes 3.显示索引、列和底层的numpy数据:
In [18]: df.index Out[18]: DatetimeIndex(['2017-08-08', '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-12', '2017-08-13'], dtype='datetime64[ns]', freq='D') In [19]: df1.columns Out[19]: Index([u'入学日期', u'姓名', u'年龄', u'性别', u'排名', u'是否'], dtype='object') In [20]: df2.values Out[20]: array([[u'\u674e\u5c0f\u5f3a', u'2017-9-1', u'\u7537', 15, 1, u'yes'], [u'\u5b59\u4e09', u'2017-9-1', u'\u7537', 16, 3, u'yes'], [u'\u738b\u73b2', u'2017-9-1', u'\u5973', 13, 2, u'yes'], [u'\u5218\u8001\u56db', u'2017-9-1', u'\u7537', 18, 4, u'yes']], dtype=object) 4.数据的快速统计汇总describe(),转置T。
In [21]: df.describe() Out[21]: A B C D count 6.000000 6.000000 6.000000 6.000000 mean -0.066044 0.071217 -0.256984 -0.219774 std 0.376911 1.319453 0.906105 0.869116 min -0.542612 -1.401814 -1.799525 -1.166227 25% -0.243504 -1.099276 -0.460149 -0.955333 50% -0.179597 0.089097 -0.122276 -0.222764 75% 0.166322 1.167466 0.062669 0.336933 max 0.488717 1.619402 0.950630 0.969136 In [22]: df2.T Out[22]: 0 1 2 3 姓名 李小强 孙三 王玲 刘老四 入学日期 2017-9-1 2017-9-1 2017-9-1 2017-9-1 性别 男 男 女 男 年龄 15 16 13 18 排名 1 3 2 4 是否 yes yes yes yes 5. 按轴进行排序和按值进行排序。
In [23]: df2.sort_index(axis=1,ascending=False) Out[23]: 是否 排名 性别 年龄 姓名 入学日期 0 yes 1 男 15 李小强 2017-9-1 1 yes 3 男 16 孙三 2017-9-1 2 yes 2 女 13 王玲 2017-9-1 3 yes 4 男 18 刘老四 2017-9-1 In [24]: df.sort_values('B') Out[24]: A B C D 2017-08-11 -0.542612 -1.401814 -0.158879 0.969136 2017-08-12 0.268779 -1.376531 0.950630 -1.041401 2017-08-13 0.488717 -0.267509 0.112117 -1.166227 2017-08-09 -0.141047 0.445702 -0.560573 0.251600 2017-08-08 -0.251957 1.408053 -0.085674 0.365377 2017-08-10 -0.218148 1.619402 -1.799525 -0.697128
6.从mysql中读取数据,import MySQLdb
In [152]: conn=MySQLdb.connect(user="root",passwd="88888",host="192.168.2.245",db="school",charset="utf8") In [153]: sql="select * from student limit 6" In [154]: df = pd.read_sql(sql,conn) In [155]: df Out[155]: id name Age 0 1 陈二 21 1 2 张路路 25 2 3 王五 35 3 4 历时 45 4 5 李四 35 5 6 赵六 75 下面是数据库里的数据
