在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 pd
1)通过二维数组创建数据框,我们看一下如何创建一个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
下面是数据库里的数据