小白也能看懂的Pandas实操演示教程(上)
![](/assets/blank.gif)
作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了解初学者学习过程的需求和问题,希望通过这个专栏能够广结好友,共同成长。
编辑:王老湿
1 数据结构的简介
pandas中有两类非常重要的数据结构,就是序列Series和数据框DataFrame.Series类似于NumPy中的一维数组,可以使用一维数组的可用函数和方法,而且还可以通过索引标签的方式获取数据,还具有索引的自动对齐功能;DataFrame类似于numpy中的二维数组,同样可以使用numpy数组的函数和方法,还具有一些其它灵活的使用。
1.1 Series的创建 三种方法
通过一维数组创建序列m
import pandas as pd
import numpy as nparr1=np.arange(10)
print("数组arr1:",arr1)
print("arr1的数据类型:",type(arr1))
s1=pd.Series(arr1)
print("序列s1:\n",s1)
print("s1的数据类型:",type(s1))
数组arr1: [0 1 2 3 4 5 6 7 8 9]
arr1的数据类型: <class 'numpy.ndarray'>
序列s1:
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32
s1的数据类型: <class 'pandas.core.series.Series'>
通过字典的方式创建序列
dict1={'a':1,'b':2,'c':3,'d':4,'e':5}
print("字典dict1:",dict1)
print("dict1的数据类型:",type(dict1))
s2=pd.Series(dict1)
print("序列s2:",s2)
print("s2的数据类型:",type(s2))
字典dict1: {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
dict1的数据类型: <class 'dict'>
序列s2:a 1
b 2
c 3
d 4
e 5
dtype: int64
s2的数据类型: <class 'pandas.core.series.Series'>
通过已有DataFrame创建
由于涉及到了DataFrame的概念,所以等后面介绍了DataFrame之后补充下如何通过已有的DataFrame来创建Series。
1.2 DataFrame的创建 三种方法
通过二维数组创建数据框
print("第一种方法创建DataFrame")
arr2=np.array(np.arange(12)).reshape(4,3)
print("数组2:",arr2)
print("数组2的类型",type(arr2))df1=pd.DataFrame(arr2)
print("数据框1:\n",df1)
print("数据框1的类型:",type(df1))
第一种方法创建DataFrame
数组2: [[ 0 1 2][ 3 4 5][ 6 7 8][ 9 10 11]]
数组2的类型 <class 'numpy.ndarray'>
数据框1:0 1 2
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
数据框1的类型: <class 'pandas.core.frame.DataFrame'>
通过字典列表的方式创建数据框
print("第二种方法创建DataFrame")
dict2={'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12],'d':[13,14,15,16]}
print("字典2-字典列表:",dict2)
print("字典2的类型",type(dict2))df2=pd.DataFrame(dict2)
print("数据框2:\n",df2)
print("数据框2的类型:",type(df2))
第二种方法创建DataFrame
字典2-字典列表: {'a': [1, 2, 3, 4], 'b': [5, 6, 7, 8], 'c': [9, 10, 11, 12], 'd': [13, 14, 15, 16]}
字典2的类型 <class 'dict'>
数据框2:a b c d
0 1 5 9 13
1 2 6 10 14
2 3 7 11 15
3 4 8 12 16
数据框2的类型: <class 'pandas.core.frame.DataFrame'>
通过嵌套字典的方式创建数据框
dict3={'one':{'a':1,'b':2,'c':3,'d':4},'two':{'a':5,'b':6,'c':7,'d':8},'three':{'a':9,'b':10,'c':11,'d':12}}
print("字典3-嵌套字典:",dict3)
print("字典3的类型",type(dict3))df3=pd.DataFrame(dict3)
print("数据框3:\n",df3)
print("数据框3的类型:",type(df3))
字典3-嵌套字典: {'one': {'a': 1, 'b': 2, 'c': 3, 'd': 4}, 'two': {'a': 5, 'b': 6, 'c': 7, 'd': 8}, 'three': {'a': 9, 'b': 10, 'c': 11, 'd': 12}}
字典3的类型 <class 'dict'>
数据框3:one three two
a 1 9 5
b 2 10 6
c 3 11 7
d 4 12 8
数据框3的类型: <class 'pandas.core.frame.DataFrame'>
有了DataFrame之后,这里补充下如何通过DataFrame来创建Series。
s3=df3['one'] #直接拿出数据框3中第一列
print("序列3:\n",s3)
print("序列3的类型:",type(s3))
print("------------------------------------------------")
s4=df3.iloc[0] #df3['a'] #直接拿出数据框3中第一行--iloc
print("序列4:\n",s4)
print("序列4的类型:",type(s4))
序列3:a 1
b 2
c 3
d 4
Name: one, dtype: int64
序列3的类型: <class 'pandas.core.series.Series'>
------------------------------------------------
序列4:one 1
three 9
two 5
Name: a, dtype: int64
序列4的类型: <class 'pandas.core.series.Series'>
2 数据索引index
无论数据框还是序列,最左侧始终有一个非原始数据对象,这个就是接下来要介绍的数据索引。通过索引获取目标数据,对数据进行一系列的操作。
2.1 通过索引值或索引标签获取数据
s5=pd.Series(np.array([1,2,3,4,5,6]))
print(s5) #如果不给序列一个指定索引值,序列会自动生成一个从0开始的自增索引
0 1
1 2
2 3
3 4
4 5
5 6
dtype: int32
通过index属性获取序列的索引值
s5.index
RangeIndex(start=0, stop=6, step=1)
为index重新赋值
s5.index=['a','b','c','d','e','f']
s5
a 1
b 2
c 3
d 4
e 5
f 6
dtype: int32
通过索引获取数据
s5[3]
4
s5['e']
5
s5[[1,3,5]]
b 2
d 4
f 6
dtype: int32
s5[:4]
a 1
b 2
c 3
d 4
dtype: int32
s5['c':]
c 3
d 4
e 5
f 6
dtype: int32
s5['b':'e'] #通过索引标签获取数据,末端标签的数据也是返回的,
b 2
c 3
d 4
e 5
dtype: int32
2.2 自动化对齐
#当对两个
s6=pd.Series(np.array([10,15,20,30,55,80]),index=['a','b','c','d','e','f'])
print("序列6:",s6)
s7=pd.Series(np.array([12,11,13,15,14,16]),index=['a','c','g','b','d','f'])
print("序列7:",s7)print(s6+s7) #s6中不存在g索引,s7中不存在e索引,所以数据运算会产生两个缺失值NaN。
#可以注意到这里的算术运算自动实现了两个序列的自动对齐
#对于数据框的对齐,不仅是行索引的自动对齐,同时也会对列索引进行自动对齐,数据框相当于二维数组的推广
print(s6/s7)
序列6: a 10
b 15
c 20
d 30
e 55
f 80
dtype: int32
序列7: a 12
c 11
g 13
b 15
d 14
f 16
dtype: int32
a 22.0
b 30.0
c 31.0
d 44.0
e NaN
f 96.0
g NaN
dtype: float64
a 0.833333
b 1.000000
c 1.818182
d 2.142857
e NaN
f 5.000000
g NaN
dtype: float64
3 pandas查询数据
通过布尔索引有针对的选取原数据的子集,指定行,指定列等。
test_data=pd.read_csv('test_set.csv')
# test_data.drop(['ID'],inplace=True,axis=1)
test_data.head()
![](/assets/blank.gif)
非数值值特征数值化
test_data['job'],jnum=pd.factorize(test_data['job'])
test_data['job']=test_data['job']+1test_data['marital'],jnum=pd.factorize(test_data['marital'])
test_data['marital']=test_data['marital']+1test_data['education'],jnum=pd.factorize(test_data['education'])
test_data['education']=test_data['education']+1test_data['default'],jnum=pd.factorize(test_data['default'])
test_data['default']=test_data['default']+1test_data['housing'],jnum=pd.factorize(test_data['housing'])
test_data['housing']=test_data['housing']+1test_data['loan'],jnum=pd.factorize(test_data['loan'])
test_data['loan']=test_data['loan']+1test_data['contact'],jnum=pd.factorize(test_data['contact'])
test_data['contact']=test_data['contact']+1test_data['month'],jnum=pd.factorize(test_data['month'])
test_data['month']=test_data['month']+1test_data['poutcome'],jnum=pd.factorize(test_data['poutcome'])
test_data['poutcome']=test_data['poutcome']+1test_data.head()
![](/assets/blank.gif)
查询数据的前5行
test_data.head()
![](/assets/blank.gif)
查询数据的末尾5行
test_data.tail()
![](/assets/blank.gif)
查询指定的行
test_data.iloc[[0,2,4,5,7]]
![](/assets/blank.gif)
查询指定的列
test_data[['age','job','marital']].head()
![](/assets/blank.gif)
查询指定的行和列
test_data.loc[[0,2,4,5,7],['age','job','marital']]
![](/assets/blank.gif)
查询年龄为51的信息
#通过布尔索引实现数据的自己查询test_data[test_data['age']==51].head()
![](/assets/blank.gif)
查询工作为5以上的年龄在51的信息
test_data[(test_data['age']==51) & (test_data['job']>=5)].head()
![](/assets/blank.gif)
查询工作为5以上,年龄在51的人员,并且只选取指定列
#只选取housing,loan,contac和poutcome
test_data[(test_data['age']==51) & (test_data['job']>=5)][['education','housing','loan','contact','poutcome']].head()
![](/assets/blank.gif)
可以看到,当有多个条件的查询,需要在&或者|的两端的条件括起来
4 对DataFrames进行统计分析
Pandas为我们提供了很多描述性统计分析的指标函数,包括,总和,均值,最小值,最大值等。
a=np.random.normal(size=10)
d1=pd.Series(2*a+3)
d2=np.random.f(2,4,size=10)
d3=np.random.randint(1,100,size=10)
print(d1)
print(d2)
print(d3)
0 5.811077
1 2.963418
2 2.295078
3 0.279647
4 6.564293
5 1.146455
6 1.903623
7 1.157710
8 2.921304
9 2.397009
dtype: float64
[0.18147396 0.48218962 0.42565903 0.10258942 0.55299842 0.108593280.66923199 1.18542009 0.12053079 4.64172891]
[33 17 71 45 33 83 68 41 69 23]
非空元素的计算
d1.count()
10
最小值
d1.min()
0.6149265534311872
最大值
d1.max()
6.217953512253818
最小值的位置
d1.idxmin()
8
最大值的位置
d1.idxmax()
1
10%分位数
d1.quantile(0.1)
1.4006153623854274
求和
d1.sum()
27.43961378467516
平均数
d1.mean()
2.743961378467515
中位数
d1.median()
2.3460435427041384
众数
d1.mode()
0 0.279647
1 1.146455
2 1.157710
3 1.903623
4 2.295078
5 2.397009
6 2.921304
7 2.963418
8 5.811077
9 6.564293
dtype: float64
方差
d1.var()
4.027871738323722
标准差
d1.std()
2.0069558386580715
平均绝对偏差
d1.mad()
1.456849211331346
偏度
d1.skew()
1.0457755613918738
峰度
d1.kurt()
0.39322767370407874
一次性输出多个描述性统计指标
d1.describe()
count 10.000000
mean 2.743961
std 2.006956
min 0.279647
25% 1.344189
50% 2.346044
75% 2.952890
max 6.564293
dtype: float64
#自定义一个函数,将这些统计描述指标全部汇总到一起
def stats(x):return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],index=['Count','Min','Which_Min','Q1','Median','Q3','Mean','Max','Which_Max','Mad','Var','Std','Skew','Kurt'])
stats(d1)
Count 10.000000
Min 0.279647
Which_Min 3.000000
Q1 1.344189
Median 2.346044
Q3 2.952890
Mean 2.743961
Max 6.564293
Which_Max 4.000000
Mad 1.456849
Var 4.027872
Std 2.006956
Skew 1.045776
Kurt 0.393228
dtype: float64
对于数字型数据,它是直接统计一些数据性描述,观察这一系列数据的范围。大小、波动趋势,便于判断后续对数据采取哪类模型更合适。
#当实际工作中我们需要处理的是一系列的数值型数据框,可以使用apply函数将这个stats函数应用到数据框中的每一列
df=pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3']) #将之前创建的d1,d2,d3数据构建数据框
print(df.head())
df.apply(stats)
x1 x2 x3
0 5.811077 0.181474 33.0
1 2.963418 0.482190 17.0
2 2.295078 0.425659 71.0
3 0.279647 0.102589 45.0
4 6.564293 0.552998 33.0
![](/assets/blank.gif)
以上很简单的创建了数值型数据的统计性描述,但对于离散型数据就不能使用该方法了。我们在统计离散变量的观测数、唯一值个数、众数水平及个数,只需要使用describe方法就可以实现这样的统计了。
train_data=pd.read_csv('train_set.csv')
# test_data.drop(['ID'],inplace=True,axis=1)
train_data.head()
![](/assets/blank.gif)
train_data['job'].describe() #离散型数据的描述
count 25317
unique 12
top blue-collar
freq 5456
Name: job, dtype: object
test_data['job'].describe() #数值型数据的描述
count 10852.000000
mean 5.593255
std 2.727318
min 1.000000
25% 3.000000
50% 6.000000
75% 8.000000
max 12.000000
Name: job, dtype: float64
除了以上简单的描述性统计之外,还提供了连续变量的相关系数(corr)和协方差(cov)的求解
df
![](/assets/blank.gif)
df.corr() #相关系数的计算方法可以调用pearson方法、kendall方法、或者spearman方法,默认使用的是pearson方法
![](/assets/blank.gif)
df.corr('spearman')
![](/assets/blank.gif)
df.corr('pearson')
![](/assets/blank.gif)
df.corr('kendall')
![](/assets/blank.gif)
#如果只关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关注x1与其余变量的相关系数
df.corrwith(df['x1'])
x1 1.000000
x2 -0.075466
x3 -0.393609
dtype: float64
![](/assets/blank.gif)
长按 2 秒,扫码即可关注
小白也能看懂的Pandas实操演示教程(上)相关推荐
- 小白也能看懂的Pandas实操演示教程(下)
点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! 作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了 ...
- 小白也可以看懂的Numpy实操演示教程
点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! 作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了 ...
- c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...
原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...
- python进阶(小白也能看懂)——装饰器浅谈(一)
python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...
- python进阶(小白也能看懂)——Map、Filter、Reduce
python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...
- python进阶(小白也能看懂)——*args与**kwargs的使用
python进阶(小白也能看懂)--*args与**kwargs的使用 第一篇 理解*args与**kwargs在定义函数时的作用 假设你写了一个函数multiply(函数定义在下面),专门用来处理两 ...
- 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...
一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...
- 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)
小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...
- armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...
小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...
最新文章
- 为什么信不过AI看病?数据集小、可靠性差,AI医疗任重道远
- 一代偶像终将老去,总有AI正在年轻
- 0402互联网新闻 | 首批进口游戏版号下放,网易腾讯获批;“少年得到”完成数千万元A轮融资...
- 【解题报告】Leecode. 575. 分糖果——Leecode每日一题系列
- oracle用命令方式创建表,oracle创建表的方法和一些常用命令
- elasticsearch报错expected block end, but found BlockMappingStart解决方法
- 【转载】以前ioi上看到的一篇关于如何成为一名程序员的文章
- 相机模型与标定(十)--RANSAC算法
- 做数据分析已经会Excel了,还要学Python吗?
- Project configuration is not up-to-date with pom.xml. Run Maven-Update Project or use Quick Fix
- 字符串(后缀自动机):COGS 2399. 循环同构
- 小波变换和motion信号处理(一)
- SonarQube 持续集成代码质量管理
- mysql事务锁死解决
- 哪款 Linux 才是更好的 CentOS 替代品?
- 打印机 打印机驱动 打印机如何与PC通信 什么通信协议 蓝牙打印机项目 蓝牙协议栈
- 镍基合金600材质,用什么配套焊材 by阿斯米合金
- OpenCV fitline直线拟合函数学习
- Android-音视频学习系列-(十)基于-FFmpeg-+-OpenSLES-实现音频万能播放器
- DCDC自举电容(BST电容)介绍
热门文章
- 如果Laravel 报错 file_put_contents(): failed to open stream
- thinkphp环境变量.env配置
- MongoDB for PHP扩展操作类
- java http2_java的okhttp3库中,客户端如何开启http2协议支持
- html输出text,为什么text();和html();输出结果不一样呢?
- thinkphp5中的系统文件上传和$_FILES用法区别
- PHP底层运行原理初探
- 2008域控服务器创建本地用户,[转载](一)安装win2008r2、域控、IIS、证书服务器、部署exchang...
- uniapp连接php,thinkphp5 对接手机uni-app的unipush推送(个推)
- 计算机组成原理 控制冒险,电子科大-系统结构实验-解决控制冒险.docx