1 简介
DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。
或许说它可能有点像matlab的矩阵,但是matlab的矩阵只能放数值型值(当然matlab也可以用cell存放多类型数据),DataFrame的单元格可以存放数值、字符串等,这和excel表很像。
同时DataFrame可以设置列名columns与行名index,可以通过像matlab一样通过位置获取数据也可以通过列名和行名定位,具体方法在后面细说。
2 创建DataFrame
首先声明一下,以下都是使用的Python 3.6.5版本为例,Python2应该也差不多吧(大概
在所有操作之前当然要先import必要的pandas库,因为pandas常与numpy一起配合使用,所以也一起import吧。
import pandas as pd import numpy as np
如果还没安装直接在cmd里pip安装吧,如果有版本选择问题,参看之前的帖子。
pip install pandas pip install numpy
2.1 直接创建#
可以直接使用pandas的DataFrame函数创建,比如接下来我们随机创建一个4*4的DataFrame。
df1=pd.DataFrame(np.random.randn(4,4),index=list('ABCD'),columns=list('ABCD'))
其中第一个参数是存放在DataFrame里的数据,第二个参数index就是之前说的行名(或者应该叫索引?),第三个参数columns是之前说的列名。
后两个参数可以使用list输入,但是注意,这个list的长度要和DataFrame的大小匹配,不然会报错。当然,这两个参数是可选的,你可以选择不设置。
而且发现,这两个list是可以一样的,但是每行每列的名字在index或columns里要是唯一的。
使用python自己的shell展示创建的结果是这样的:
![76362913ca7846f9dce4c4004448c5a7.png](https://i-blog.csdnimg.cn/blog_migrate/a205ae629102a16de68eaad7d54881dc.png)
或者在jupyter里面更酷点的样子,接下来都使用jupyter输出展示吧。
![8f2c738f3ace140b1421a520d13a3eb3.png](https://i-blog.csdnimg.cn/blog_migrate/a645af5e98f31e9c734fad56800ea512.jpeg)
当然,如果你的数据量贼小,也可以自己输入创建,类似这样。
df2=pd.DataFrame([[1,2,3,4],[2,3,4,5], [3,4,5,6],[4,5,6,7]], index=list('ABCD'),columns=list('ABCD'))
这样也可以得到这样子的DataFrame:
![f89afed5ae76ea46a1dadfd5d7bd88cf.png](https://i-blog.csdnimg.cn/blog_migrate/22733a0da200f3cc04ee8ccbacdb4ff7.jpeg)
2.2 使用字典创建#
仍然是使用DataFrame这个函数,但是字典的每个key的value代表一列,而key是这一列的列名。比如这样。
dic1={'name':['小明','小红','狗蛋','铁柱'],'age':[17,20,5,40],'gender':['男','女','女','男']} df3=pd.DataFrame(dic1)
输出结果是这样的
![3abab17206d173167b6bd32bba89214c.png](https://i-blog.csdnimg.cn/blog_migrate/190f763705b08d9cefd539018facb65f.jpeg)
3 查看与筛选数据
python没有matlab的工作区直接查看变量与内容,这大概是python科学计算的一个缺点。所以需要格外的代码来查看,最基本的直接写变量名与print就不说了。3.1 查看列的数据类型#
使用dtypes方法可以查看各列的数据类型,比如说刚刚的df3。
df3.dtypes
输出的结果是这样:
![c19681088dd64c8aebf937a36db9fec8.png](https://i-blog.csdnimg.cn/blog_migrate/30f9b076e25843da54110d86c0724600.png)
3.2 查看DataFrame的头尾#
使用head可以查看前几行的数据,默认的是前5行,不过也可以自己设置。
使用tail可以查看后几行的数据,默认也是5行,参数可以自己设置。
比如随意设置一个6*6的数据,只看前5行。
df4=pd.DataFrame(np.random.randn(6,6)) df4.head()
![e211c982aaf03d069663c44e1a2a3879.png](https://i-blog.csdnimg.cn/blog_migrate/f20ba924dfe5946a7e6887a7abc08073.jpeg)
比如只看前3行。
df4.head(3)
![c1aa08467f69e335014c7adecfefc457.png](https://i-blog.csdnimg.cn/blog_migrate/5c761b27459cbf7a7cfc3b1b52be6796.jpeg)
比如看后5行。
df4.tail()
![cdd6a5ea29789a19876d7d5de042ed74.png](https://i-blog.csdnimg.cn/blog_migrate/0e8a056da5a0800dc0ed44eb31f544a5.jpeg)
比如只看后2行。
df4.tail(2)
![2d027798d605900ac1dced1577deb06d.png](https://i-blog.csdnimg.cn/blog_migrate/c1a55b73e6b5729bf2e35c3e97c697db.jpeg)
3.3 查看行名与列名#
使用index查看行名,columns查看列名。具体由例子感受吧。
查看行名。
df1.index
![e50d3a56c9a6b7cf1b8a6dda5e2b2b33.png](https://i-blog.csdnimg.cn/blog_migrate/f148b1713bb0d714b404e487618bb48c.png)
查看列名。
df3.columns
![a13a0dbad404fc79205152da42e7fb90.png](https://i-blog.csdnimg.cn/blog_migrate/a1de87118cea077306a0810693f6d1de.png)
3.4 查看数据值#
使用values可以查看DataFrame里的数据值,返回的是一个数组。
比如说查看所有的数据值。
df3.values
![7d332b2479045349935965ac61525ec5.png](https://i-blog.csdnimg.cn/blog_migrate/dd2f7c95d6b2e13851b11d901aa57bc5.jpeg)
比如说查看某一列所有的数据值。
df3['name'].values
![d3393e5a9730d9f322616762ae3fff8c.png](https://i-blog.csdnimg.cn/blog_migrate/aeb84f565aced0928565c61c9c1d0259.png)
还有另一种操作,使用loc或者iloc查看数据值(但是好像只能根据行来查看?)。区别是loc是根据行名,iloc是根据数字索引(也就是行号)。
比如说这样。
df1.loc['A']
![367bc507a65492574c22691d449a3bde.png](https://i-blog.csdnimg.cn/blog_migrate/1b42ab1f982141406395c81b1eb78387.jpeg)
或者这样。
df1.iloc[0]
![3bfb8da1e8c3c952d83152b403d9ee9d.png](https://i-blog.csdnimg.cn/blog_migrate/8cf10f6c080936cd442c26ace4bb9568.jpeg)
按列进行索引查看数据还能直接使用列名,但这种方法对行索引不适用。
df3['name']
![da5d50a660352b11ae3656e1715c6f7c.png](https://i-blog.csdnimg.cn/blog_migrate/88a99e084db0686f0cf2b8bd50228375.jpeg)
3.5 查看行列数#使用shape查看行列数,参数为0表示查看行数,参数为1表示查看列数。
df3.shape[0]
![0770caf576db94bcaada30a84e88e352.png](https://i-blog.csdnimg.cn/blog_migrate/6b25eea9d581915719199b974dc10762.jpeg)
df3.shape[1]
![1cd38061c6984b032b4a445c9e6eca4a.png](https://i-blog.csdnimg.cn/blog_migrate/e150ce941250ed05efb49450c063712e.jpeg)
4 基本操作
DataFrame有些方法可以直接进行数据统计,矩阵计算之类的基本操作。4.1 转置#
直接字母T,线性代数上线。
比如说把之前的df2转置一下。
df3.T
![6fe33418caa8cb58420540e222c3c1cd.png](https://i-blog.csdnimg.cn/blog_migrate/cd7604ebf1e604ed216f8cc50776f313.jpeg)
4.2 描述性统计#
使用describe可以对数据根据列进行描述性统计。
比如说对df1进行描述性统计。
df1.describe()
![94d482fb4268d5383d5106729fdd4e28.png](https://i-blog.csdnimg.cn/blog_migrate/a3d24f5d418c1b1fb9c8bbc94accfb9d.jpeg)
如果有的列是非数值型的,那么就不会进行统计。
如果想对行进行描述性统计,请参看4.1(转置后进行describe呀!)4.3 计算#
使用sum默认对每列求和,sum(1)为对每行求和。比如
df3.sum()
![3723b215ae2a0f527761b6870faca1e7.png](https://i-blog.csdnimg.cn/blog_migrate/8437ca2d20cd829d279f529764751e20.jpeg)
可以发现就算元素是字符串,使用sum也会加起来。
df3.sum(1)
![c5d7d67ae72d31645453863678687638.png](https://i-blog.csdnimg.cn/blog_migrate/8fd2f4455cf08cfc4a1289a27c71466d.jpeg)
而一行中,有字符串有数值则只计算数值。数乘运算使用apply,比如。
df2.apply(lambda x:x*2)
![f8d27b01951f2553f18f591d00568805.png](https://i-blog.csdnimg.cn/blog_migrate/2144c1c263a74316928a5253c0eec3d2.jpeg)
如果元素是字符串,则会把字符串再重复一遍。乘方运算跟matlab类似,直接使用两个*,比如。
df2**2
![bdb77efa98d7273160c6aea87388c863.png](https://i-blog.csdnimg.cn/blog_migrate/6bab576ab3a48a624096ee96b5117fc2.jpeg)
乘方运算如果有元素是字符串的话,就会报错。4.4 新增#扩充列可以直接像字典一样,列名对应一个list,但是注意list的长度要跟index的长度一致。
df2['E']=['999','999','999','999'] df2
![c1aa08467f69e335014c7adecfefc457.png](https://i-blog.csdnimg.cn/blog_migrate/5c761b27459cbf7a7cfc3b1b52be6796.jpeg)
还可以使用insert,使用这个方法可以指定把列插入到第几列,其他的列顺延。
df2.insert(0,'F',[888,888,888,888]) df2
![ab5715e923510ba7cdb63fae2703035f.png](https://i-blog.csdnimg.cn/blog_migrate/aff90237bbec3309121532d0062c3ba4.png)
4.5 合并#使用join可以将两个DataFrame合并,但只根据行列名合并,并且以作用的那个DataFrame的为基准。如下所示,新的df7是以df2的行号index为基准的。
df6=pd.DataFrame(['my','name','is','a'],index=list('ACDH'),columns=list('G')) df6 df7=df2.join(df6) df7
![63b856a381944fdde89da91480d5035b.png](https://i-blog.csdnimg.cn/blog_migrate/cbab11ad796bfa6914986de6650d65d1.jpeg)
但是,join这个方法还有how这个参数可以设置,合并两个DataFrame的交集或并集。参数为'inner'表示交集,'outer'表示并集。
df8=df2.join(df6,how='inner') df8 df9=df2.join(df6,how='outer') df9
![c302bf2d7fff3115f385589554308207.png](https://i-blog.csdnimg.cn/blog_migrate/69d54dab17d803a41983a8d83a3a8b58.jpeg)
如果要合并多个Dataframe,可以用list把几个Dataframe装起来,然后使用concat转化为一个新的Dataframe。
df10=pd.DataFrame([1,2,3,4],index=list('ABCD'),columns=['a']) df11=pd.DataFrame([10,20,30,40],index=list('ABCD'),columns=['b']) df12=pd.DataFrame([100,200,300,400],index=list('ABCD'),columns=['c']) list1=[df10.T, df11.T, df12.T] df13=pd.concat(list1) df13
![332df556b4a43ee86b2351069bd71d87.png](https://i-blog.csdnimg.cn/blog_migrate/9cd72bce01b71256c419ae74d62eb865.jpeg)
作者: 败北桑
出处:https://www.cnblogs.com/IvyWong/p/9203981.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。