pandas学习笔记

pandas是基于numpy开发出的数据分析包,用于高效地操作大型数据集。pandas的数据结构有三种 分别为 series,dataframe和panel,对应一维,二维,三维数据。 其中datafram最为常用,我们仅对dataframe进行记录。

dataframe其实就是一个形似数据库中的table一样的数据结构,我们可以从列表,字典,series和numpy ndarray和 dataframe创建df;同时还可以从csv文件来读入数据创建df

# pandas中的DataFrame可以使用以下构造函数创建
pandas.DataFrame( data, index, columns, dtype, copy)
编号 参数 描述
1 data 数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame
2 index 行标签,默认是从0开始的整数
3 columns 列表千年,即字段名,默认是从0开始的整数
4 dtype 每一列的数据类型
5 copy 如果默认值为False,则此命令(或任何它)用于复制数据

pandas数据表创建

import pandas as pd
import numpy as np# 使用列表列表(列表的元素是一个列表)来创建df
data = [['Alex',12],['Bob',15],['Jack',18]]
df = pd.DataFrame(data)
print (df)'''0   1
0  Alex  12
1   Bob  15
2  Jack  18
'''

由结果可知,如果我们不添加列名的话,默认是从0开始标记列名,这里我们指明列名,数据类型。另外,我们还可以设置特殊的index

data = [['Alex',12],['Bob',15],['Jack',18]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype='float')
print (df)'''Name   Age
0  Alex  12.0
1   Bob  15.0
2  Jack  18.0
'''#  我们还可以使用字典列表来创建一个df,从而不用设置columns
data = [{'Name': 'Alex', 'Age': 12},{'Name': 'Bob', 'Age': 15},{'Name': 'Jack', 'Age': 18,'Phone':'521366'}]
df = pd.DataFrame(data)
print(df)'''Age  Name   Phone
0   12  Alex     NaN
1   15   Bob     NaN
2   18  Jack  521366
'''

我们会发现,使用字典列表的方式来创建,如果有的字典中缺少某个字段 那么会自动填充NaN
上述的方法都是由一个list来创建dataframe,list中每个元素代表一行的数据;

我们还可以使用字典 创建整列数据

data = {'Name':['Alex','Bob','Jack'],'Age':[12,15,18]}
df = pd.DataFrame(data,index=['rank1','rank2','rank3'])
print(df)'''Age  Name
rank1   12  Alex
rank2   15   Bob
rank3   18  Jack
'''

除此之外,我们还可以使用numpy和读取csv数据的方式创建dataframe

# 使用numpy生成dataframe
import numpy as np
data = np.random.randn(5,5)df = pd.DataFrame(data,columns=['A','B','C','D','E'])
print(df)'''A         B         C         D         E
0 -0.372475  0.450400  0.742329 -1.037012 -0.902100
1  0.696321 -1.055079 -2.263853  0.941368  0.376098
2  0.721607 -0.178860  0.413946 -0.509012 -0.297089
3  0.498155 -1.236906  0.216542 -1.110133 -1.033379
4 -1.199099 -1.613378 -0.370484 -0.354009  0.125048
'''
#从csv文件读取数据 添加到df
df = pd.read_csv("titanic.csv", header=0)
print(df.head(10)) #打印前十行,结果太多不再展示

pandas 数据表筛选,查询排序

pandas的排序主要有两种排序:

  • 对index进行排序(包括对行index排序和列index排序)
  • 对某一列值进行排序:(基于某一列的值交换行)
# index排序
unsort_df = pd.DataFrame(np.arange(25).reshape(5,5),index = [4,0,2,1,3],columns=['B','A','E','C','D'])
print(unsort_df)'''B   A   E   C   D
4   0   1   2   3   4
0   5   6   7   8   9
2  10  11  12  13  14
1  15  16  17  18  19
3  20  21  22  23  24
'''

对行index进行排序:

sort_df = unsort_df.sort_index(axis=0,ascending=True) # 按照升序排列
print(sort_df)'''B   A   E   C   D
0   5   6   7   8   9
1  15  16  17  18  19
2  10  11  12  13  14
3  20  21  22  23  24
4   0   1   2   3   4
'''

对列标签进行排序:

sort_df = unsort_df.sort_index(axis=1)
print(sort_df)'''A   B   C   D   E
4   1   0   3   4   2
0   6   5   8   9   7
2  11  10  13  14  12
1  16  15  18  19  17
3  21  20  23  24  22
'''

对某一列的值进行排序:

# 对某一列的值进行排序
unsort_df = pd.DataFrame(np.random.rand(5,5),columns=['A','B','C','D','E'])
print(unsort_df)'''A         B         C         D         E
0  0.064110  0.261228  0.407898  0.442963  0.543346
1  0.108448  0.860408  0.127829  0.081763  0.122567
2  0.102532  0.575612  0.406204  0.343808  0.787604
3  0.336907  0.315543  0.880459  0.981245  0.074163
4  0.806219  0.922854  0.649067  0.335794  0.271572
'''sort_df = unsort_df.sort_values(by='A',kind='mergesort') # 对第一列A进行排序,默认为升序
print(sort_df)'''A         B         C         D         E
0  0.303920  0.558314  0.767881  0.172027  0.635556
3  0.404746  0.834687  0.695462  0.747880  0.258342
2  0.409437  0.427695  0.217155  0.041271  0.572030
4  0.599488  0.592189  0.812071  0.284848  0.767630
1  0.864761  0.123731  0.807521  0.071350  0.356040
'''

在上面的排序函数 sort_values()中,有by和kind两个字段;by设置需要排序的列,kind设置所使用的排序算法。一共有三种算法:mergesortheapsortquicksort;推荐使用mergesort算法

pandas索引

dataframe的索引中,有三个函数可以用于选择数据

  • loc(): 使用index来选择数据 (based indexing)
  • iloc():使用整数索引来选择数据 (positional indexing)
  • ix(): iloc()和loc()的混合 (已废弃,不推荐使用)

我们分别使用上面的三种索引,来选择行数据,列数据:

使用loc():

df = pd.DataFrame(np.random.rand(5,5),columns=['A','B','C','D','E'],index=['r1','r2','r3','r4','r5'])
print(df)'''A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r2  0.195108  0.688970  0.756126  0.065059  0.565333
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''#获取列数据
# 获取指定单列
print(df.loc[:,'A']) '''
r1    0.560104
r2    0.762691
r3    0.517329
r4    0.976693
r5    0.859421
Name: A, dtype: float64
'''
#获取指定列 多列
print(df.loc[:,['C','E']]) # 获取 'C','E'两列
'''C         E
r1  0.835193  0.025310
r2  0.927207  0.647369
r3  0.165869  0.081265
r4  0.455334  0.322755
r5  0.417843  0.629403
'''
print(df.loc[:,'C':'E'])   # 获取 'C','D','E'三列
'''C         D         E
r1  0.835193  0.082388  0.025310
r2  0.927207  0.806717  0.647369
r3  0.165869  0.046043  0.081265
r4  0.455334  0.916932  0.322755
r5  0.417843  0.015367  0.629403
'''# 获取行数据
# 获取'r2' 行
print(df.loc['r2',:])
'''
A    0.762691
B    0.895068
C    0.927207
D    0.806717
E    0.647369
Name: r2, dtype: float64
'''# 获取'r2','r3','r4' 三行
print(df.loc['r2':'r4',:]) #获取行 r2-r4
'''A         B         C         D         E
r2  0.762691  0.895068  0.927207  0.806717  0.647369
r3  0.517329  0.267965  0.165869  0.046043  0.081265
r4  0.976693  0.365548  0.455334  0.916932  0.322755
'''# 获取'r2','r4'两行
print(df.loc[['r2','r4'],:]) #获取行 r2,r4
'''A         B         C         D         E
r2  0.762691  0.895068  0.927207  0.806717  0.647369
r4  0.976693  0.365548  0.455334  0.916932  0.322755
'''

另外,在我们进行索引的时候,就像python中的切片一样,如果是针对行的索引,那么后边的,: 是可以省略不写的。

iloc():

# iloc方法 使用整数切片(数字为具体的行号)
#  获取指定行print(df)'''A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r2  0.195108  0.688970  0.756126  0.065059  0.565333
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''print(df.iloc[2]) # 获取第三行
'''
A    0.365706
B    0.648914
C    0.579140
D    0.660109
E    0.054941
Name: r3, dtype: float64
'''print(df.iloc[2:4]) #  获取第三,第四行
'''A         B         C         D         E
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
'''
print(df.iloc[[0,2,4],:]) #获取0,2,4三行
'''A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''#获取列数据
# 获取指定列 结果不再展示
print(df.iloc[:,2]) #获取第三列
print(df.iloc[:,2:5]) #获取第三,第四列
print(df.iloc[:,[0,2,4]]) #获取0,2,4三列

ix():

# ix方法
print(df.ix[0:3,['A','B','E']])
'''A         B         E
r1  0.319453  0.719874  0.796801
r2  0.195108  0.688970  0.565333
r3  0.365706  0.648914  0.054941
'''

ix()方法是上述两个方法的结合,即既可以使用数字,也可以使用标签。但是pandas中不再推荐使用

pandas 对数据表进行操作

在操作中,最简单的就是对数据进行增删:

df = pd.DataFrame(np.random.rand(3,3),columns=['A','B','C'],index=['r1','r2','r3'])
print(df)
'''A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
'''# 增删列
# 如果想要仅仅在最后添加一列,,方法如下
df['new_col1'] = None
print(df)
'''A         B         C new_col1
r1  0.653356  0.960060  0.552862     None
r2  0.774473  0.272467  0.147769     None
r3  0.049872  0.943801  0.965931     None
'''df['new_col2'] = 0.5
print(df)
'''A         B         C new_col1  new_col2
r1  0.653356  0.960060  0.552862     None       0.5
r2  0.774473  0.272467  0.147769     None       0.5
r3  0.049872  0.943801  0.965931     None       0.5
'''# 删除列
df.drop(['new_col1','new_col2'],axis=1,inplace=True)
print(df)
'''A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
'''

如果想增加多列,方法如下:

# 在最后添加多列:
df2 = pd.DataFrame(np.random.randn(3,2),columns = ['add1','add2'],index=['r1','r2','r3'])
print(df2)
'''add1      add2
r1  2.050387  0.471776
r2  0.804328 -0.562791
r3  1.140708 -1.477404
'''df3 = pd.DataFrame(np.random.randn(2,3),columns = ['A','B','C'])
print(df3)
'''A         B         C
0 -0.729599  0.154387 -0.325885
1  0.378690  0.204472 -0.374436
'''new_df = pd.concat([df,df2],axis=1)
print(new_df)
'''A         B         C      add1      add2
r1  0.653356  0.960060  0.552862  2.050387  0.471776
r2  0.774473  0.272467  0.147769  0.804328 -0.562791
r3  0.049872  0.943801  0.965931  1.140708 -1.477404
'''

pd.concat()用于连接dataframe,其中axis属性代表拼接方向;如果axis=0代表沿行方向拼接,axis=1代表沿列方向拼接

# 沿行方向拼接df
new_df = pd.concat([df,df3],axis=0)
print(new_df)
'''A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
0  -0.729599  0.154387 -0.325885
1   0.378690  0.204472 -0.374436
'''
# 按照标签删除行
new_df.drop(['r1','r3'], axis=0,inplace=True)
print(new_df)
'''A         B         C
r2  0.774473  0.272467  0.147769
0  -0.729599  0.154387 -0.325885
1   0.378690  0.204472 -0.374436
'''#增加一个新的行
new_df = new_df.append(pd.Series([0,1,2],index=['A','B','C']),ignore_index=True)
print(new_df)
'''A         B         C
0  0.774473  0.272467  0.147769
1 -0.729599  0.154387 -0.325885
2  0.378690  0.204472 -0.374436
3  0.000000  1.000000  2.000000
'''

dataframe 提供了一系列函数对数据进行统计分析:

df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print(df)'''a         b         c         d         e
0 -0.123195  0.904182  1.954444 -0.161568 -1.452412
1  0.020782 -0.816824  0.676511  1.370532  0.883918
2 -1.196381  2.156407  1.325780 -0.107228 -0.060447
3 -1.413799 -0.882798  0.284797  0.731573  0.210051
4 -0.170625 -1.391171 -0.139347  1.059765  1.102944
5 -1.207354 -0.893137  0.928643  0.070762  1.007776
6  0.603928 -2.299983  2.158155  0.127855  0.011646
7 -0.735168 -1.144970 -0.815661 -0.112566 -0.942321
8  1.582841 -1.520188 -0.463830  1.045699 -0.064077
9 -1.341750 -0.022456 -1.641289  1.708361 -0.501614
'''

列之间协方差:

# 列与列之间的协方差
print(df.cov())
print("\na,e协方差:{}\n".format(df['a'].cov(df['e'])))
'''a         b         c         d         e
a  0.950983 -0.602311  0.195242  0.075699 -0.009229
b -0.602311  1.673961  0.269066 -0.231610 -0.389904
c  0.195242  0.269066  1.489807 -0.530289  0.009390
d  0.075699 -0.231610 -0.530289  0.481481  0.213109
e -0.009229 -0.389904  0.009390  0.213109  0.701188a,e协方差:-0.009229160115646852'''

列之间相关性:

# 列与列相关性:
print (df.corr())
print("\na,e相关性:{}\n".format(df['a'].corr(df['e'])))
'''a         b         c         d         e
a  1.000000 -0.477377  0.164029  0.111870 -0.011302
b -0.477377  1.000000  0.170381 -0.257986 -0.359889
c  0.164029  0.170381  1.000000 -0.626121  0.009187
d  0.111870 -0.257986 -0.626121  1.000000  0.366771
e -0.011302 -0.359889  0.009187  0.366771  1.000000a,e相关性:-0.011302084979431462
'''

一些简单统计指标,结果不再展示:

# 某一列 和,最大值,最小值,均值,方差
print(df['a'].sum())
print(df['a'].max())
print(df['a'].min())
print(df['a'].mean())
print(df['a'].var())

pandas数据查询:

dataframe还可以像SQL一样进行查询使用

# 首先创建一个数据表
data_dict = {'Name':['Alex','Bob','Conan','Jakc'],'Age':[22,25,26,23],'Salary':[2100,2300,2500,4100],'Department':['Sale','Tech','Sale','Support']}
df = pd.DataFrame(data_dict,columns=['Name','Age','Salary','Department'])
print(df)
'''Name  Age  Salary Department
0   Alex   22    2100       Sale
1    Bob   25    2300       Tech
2  Conan   26    2500       Sale
3   Jakc   23    4100    Support
'''# 查看公司所有人员 姓名及年龄
print(df[['Name','Age']])
'''Name  Age
0   Alex   22
1    Bob   25
2  Conan   26
3   Jakc   23
'''# 查看年龄大于等于25的人员名单
print(df[df['Age']>=25])  #类似numpy中的布尔索引获取值
'''Name  Age  Salary Department
1    Bob   25    2300       Tech
2  Conan   26    2500       Sale
'''#获取工资前两名的员工信息
print(df.sort_values('Salary',ascending=False).head(2))
'''Name  Age  Salary Department
3   Jakc   23    4100    Support
2  Conan   26    2500       Sale
'''#获取每个部门的平均工资
print(df.groupby('Department')['Salary'].mean())'''
Department
Sale       2300
Support    4100
Tech       2300
Name: Salary, dtype: int64
'''

[Pandas 学习笔记] - No.1 pandas学习笔记相关推荐

  1. python数据挖掘学习笔记】十.Pandas、Matplotlib、PCA绘图实用代码补充

    #2018-03-23 18:56:38 March Friday the 12 week, the 082 day SZ SSMR https://blog.csdn.net/eastmount/a ...

  2. 免费学习机器学习和深度学习的源码、学习笔记和框架分享

    机器学习和深度学习的免费学习源码.学习笔记和框架分享 python笔记 源码 python导入模块的的几种方式 在python中,字典按值排序 python中set的基本常用方法 python取出fr ...

  3. 强化学习笔记(4)-深度Q学习

    以下为学习<强化学习:原理与python实现>这本书的笔记. 在之前学习到的强度学习方法中,每次更新价值函数只更新某个状态动作对的价值估计.但是有些情况下状态动作对的数量非常大,不可能对所 ...

  4. [学习笔记] [机器学习] 7. 集成学习(Bagging、随机森林、Boosting、GBDT)

    视频链接 数据集下载地址:无需下载 1. 集成学习算法简介 学习目标: 了解什么是集成学习 知道机器学习中的两个核心任务 了解集成学习中的 Boosting 和 Bagging 1.1 什么是集成学习 ...

  5. 计算机基础与应用(上)笔记总结,计算机基础学习心得体会范文(通用3篇)

    计算机基础学习心得体会范文(通用3篇) 当我们对人生或者事物有了新的思考时,好好地写一份心得体会,这样可以记录我们的思想活动.那么要如何写呢?以下是小编精心整理的计算机基础学习心得体会范文(通用3篇) ...

  6. 学习 慕课网 PHP工程师学习计划--我的笔记汇总

    为了进一步学习PHP,本周我选定了慕课网的PHP工程师学习计划, 从今天2015-07-06 10:24:47开始从头学习:计划本周尽快学习完成本课程,谨此作为笔记. 有个好的学习计划和思路非常非常重 ...

  7. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  8. JavaScript学习笔记(十)——学习心得与经验小结

    JavaScript学习笔记(十)--学习心得与经验小结 目前我先列好提纲,利用每晚和周末的闲暇时间,将逐步写完 ^_^ 转载于:https://www.cnblogs.com/mixer/archi ...

  9. 强化学习笔记4:强化学习分类

    1 model-free & model-based model-based(有模型) RL agent,它通过学习环境的状态转移来采取动作. model-free(免模型) RL agent ...

最新文章

  1. ABC Perl Programing - 回 2gua 短消息
  2. 使用pyinstaller打包django3.2
  3. 配置 docker0 网桥
  4. 图像处理的交并比(IoU)
  5. bashrc,bash_profile和/etc/profile
  6. WinCE驱动开发问题精华集锦
  7. 2017《时间的朋友》思维导图(脑图整理版)
  8. 模拟器与真机的程序差别J2ME
  9. 【2012百度之星资格赛】J:百度的新大厦
  10. 复合选择器-并集选择器(HTML、CSS)
  11. dotproject问题。
  12. ps自带磨皮滤镜插件Portraiture3PS版
  13. Mac使用——MongoDB的下载和Compass可视化工具,以及安装过程
  14. 什么品牌蓝牙耳机音质好?通话质量好蓝牙耳机
  15. linux光盘游戏,Linux下五个好玩的即时战略游戏
  16. 【Leetcode 刷题题解】python语言+最优美解答+由易到难
  17. 国产UOS系统之——安装N卡驱动(多屏显示)
  18. golang_逃逸分析
  19. python画气泡图_用python 来绘制气泡图的简单技巧
  20. 002:Python爬虫Urllib库全面分析

热门文章

  1. 最通俗易懂的讲解:lambda表达式
  2. Transformer课程 第46章 Transformer模型TAPAS架构
  3. Spark 优化加速
  4. 在ArrayList中根据自定义类的一个属性找某个对象
  5. js对象数组根据某一属性查找对象
  6. 大华sdk对接php,大华网络摄像机SDK对接
  7. 第三代在线娃娃机到底是什么,与传统在线娃娃机有什么区别?
  8. 阿里钉钉总裁威武,鼓励「领导向下属写周报」
  9. Android screenOrientation属性解析
  10. 在线订机票系统用例说明