作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了解初学者学习过程的需求和问题,希望通过这个专栏能够广结好友,共同成长。

编辑:王老湿

今天主要带大家来实操学习下Pandas,因为篇幅原因,分为了两部分,本篇为上。

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()

非数值值特征数值化

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()

查询数据的前5行

test_data.head()

查询数据的末尾5行

test_data.tail()

查询指定的行

test_data.iloc[[0,2,4,5,7]]

查询指定的列

test_data[['age','job','marital']].head()

查询指定的行和列

test_data.loc[[0,2,4,5,7],['age','job','marital']]

查询年龄为51的信息

#通过布尔索引实现数据的自己查询test_data[test_data['age']==51].head()

查询工作为5以上的年龄在51的信息

test_data[(test_data['age']==51) & (test_data['job']>=5)].head()

查询工作为5以上,年龄在51的人员,并且只选取指定列

#只选取housing,loan,contac和poutcome
test_data[(test_data['age']==51) & (test_data['job']>=5)][['education','housing','loan','contact','poutcome']].head()
可以看到,当有多个条件的查询,需要在&或者|的两端的条件括起来

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

以上很简单的创建了数值型数据的统计性描述,但对于离散型数据就不能使用该方法了。我们在统计离散变量的观测数、唯一值个数、众数水平及个数,只需要使用describe方法就可以实现这样的统计了。

train_data=pd.read_csv('train_set.csv')
# test_data.drop(['ID'],inplace=True,axis=1)
train_data.head()
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
 df.corr()  #相关系数的计算方法可以调用pearson方法、kendall方法、或者spearman方法,默认使用的是pearson方法
df.corr('spearman')
df.corr('pearson')
df.corr('kendall')
#如果只关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关注x1与其余变量的相关系数
df.corrwith(df['x1'])
x1    1.000000
x2   -0.075466
x3   -0.393609
dtype: float64
OK,今天的pandas实操演示就到这里,剩下的内容我们下期见。

长按 2 秒,扫码即可关注

小白也能看懂的Pandas实操演示教程(上)相关推荐

  1. 小白也能看懂的Pandas实操演示教程(下)

    点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! 作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了 ...

  2. 小白也可以看懂的Numpy实操演示教程

    点击上方"AI派",选择"设为星标" 最新分享,第一时间送达! 作者:奔雷手,目前是名在校学生,当前主要在学习机器学习,也在做机器学习方面的助教,相对还是比较了 ...

  3. c语言程序和plc程序的区别,一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂!...

    原标题:一文告诉你PLC与计算机的本质区别在哪里!小白都能看懂! 你真的了解PLC吗?你知道PLC与计算机的本质区别吗?我来简单解释一下吧. 1.PLC可以工作在极其恶劣的电磁环境中 如果我们把计算机 ...

  4. python进阶(小白也能看懂)——装饰器浅谈(一)

    python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...

  5. python进阶(小白也能看懂)——Map、Filter、Reduce

    python进阶(小白也能看懂)--Map.Filter.Reduce 第三篇 Map.Filter.Reduce是python中常用的函数,使用这些函数能够给我们带来很多便捷. Map map(fu ...

  6. python进阶(小白也能看懂)——*args与**kwargs的使用

    python进阶(小白也能看懂)--*args与**kwargs的使用 第一篇 理解*args与**kwargs在定义函数时的作用 假设你写了一个函数multiply(函数定义在下面),专门用来处理两 ...

  7. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  8. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  9. armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...

    小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...

最新文章

  1. 为什么信不过AI看病?数据集小、可靠性差,AI医疗任重道远
  2. 一代偶像终将老去,总有AI正在年轻
  3. 0402互联网新闻 | 首批进口游戏版号下放,网易腾讯获批;“少年得到”完成数千万元A轮融资...
  4. 【解题报告】Leecode. 575. 分糖果——Leecode每日一题系列
  5. oracle用命令方式创建表,oracle创建表的方法和一些常用命令
  6. elasticsearch报错expected block end, but found BlockMappingStart解决方法
  7. 【转载】以前ioi上看到的一篇关于如何成为一名程序员的文章
  8. 相机模型与标定(十)--RANSAC算法
  9. 做数据分析已经会Excel了,还要学Python吗?
  10. Project configuration is not up-to-date with pom.xml. Run Maven-Update Project or use Quick Fix
  11. 字符串(后缀自动机):COGS 2399. 循环同构
  12. 小波变换和motion信号处理(一)
  13. SonarQube 持续集成代码质量管理
  14. mysql事务锁死解决
  15. 哪款 Linux 才是更好的 CentOS 替代品?
  16. 打印机 打印机驱动 打印机如何与PC通信 什么通信协议 蓝牙打印机项目 蓝牙协议栈
  17. 镍基合金600材质,用什么配套焊材 by阿斯米合金
  18. OpenCV fitline直线拟合函数学习
  19. Android-音视频学习系列-(十)基于-FFmpeg-+-OpenSLES-实现音频万能播放器
  20. DCDC自举电容(BST电容)介绍

热门文章

  1. 如果Laravel 报错 file_put_contents(): failed to open stream
  2. thinkphp环境变量.env配置
  3. MongoDB for PHP扩展操作类
  4. java http2_java的okhttp3库中,客户端如何开启http2协议支持
  5. html输出text,为什么text();和html();输出结果不一样呢?
  6. thinkphp5中的系统文件上传和$_FILES用法区别
  7. PHP底层运行原理初探
  8. 2008域控服务器创建本地用户,[转载](一)安装win2008r2、域控、IIS、证书服务器、部署exchang...
  9. uniapp连接php,thinkphp5 对接手机uni-app的unipush推送(个推)
  10. 计算机组成原理 控制冒险,电子科大-系统结构实验-解决控制冒险.docx