上两篇原创的文章,小编主要是讲了数据可视化方面的内容,但是好像看得人不是很多的样子(搞得小编心里拔凉拔凉的....)

  • 【硬核干货】4500字、10个案例分享几个Python可视化小技巧,助你绘制高质量图表

  • 【硬核干货】| 3000字推荐一个可视化神器,50行Python代码制作数据大屏

今天小编打算来讲一讲数据分析方面的内容,整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货,我们大致会说

  • Pandas计算交叉列表

  • Pandas将字符串与数值转化成时间类型

  • Pandas将字符串转化成数值类型

Pandas当中的交叉列表

首先我们来讲一下Pandas模块当中的crosstab()函数,它的作用主要是进行分组之后的信息统计,里面会用到聚合函数,默认的是统计行列组合出现的次数,参数如下

pandas.crosstab(index, columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,margins_name='All',dropna=True,normalize=False)

下面小编来解释一下里面几个常用的函数

  • index: 指定了要分组的类目,作为行

  • columns: 指定了要分组的类目,作为列

  • rownames/colnames: 行/列的名称

  • aggfunc: 指定聚合函数

  • values: 最终在聚合函数之下,行与列一同计算出来的值

  • normalize: 标准化统计各行各列的百分比

我们通过几个例子来进一步理解corss_tab()函数的作用,我们先导入要用到的模块并且读取数据集

import pandas as pddf = pd.read_excel(io="supermarkt_sales.xlsx",engine="openpyxl",sheet_name="Sales",skiprows=3,usecols="B:R",nrows=1000,
)

output

我们先简单来看几个corsstab()函数的例子,代码如下

pd.crosstab(df['城市'], df['顾客类型'])

output

顾客类型   会员   普通
省份
上海    124  115
北京    116  127
四川     26   35
安徽     28   12
广东     30   36
.......

这里我们将省份指定为行索引,将会员类型指定为列,其中顾客类型有“会员”、“普通”两种,举例来说,四川省的会员顾客有26名,普通顾客有35名。

当然我们这里只是指定了一个列,也可以指定多个,代码如下

pd.crosstab(df['省份'], [df['顾客类型'], df["性别"]])

output

顾客类型  会员      普通
性别    女性  男性  女性  男性
省份
上海    67  57  53  62
北京    53  63  59  68
四川    17   9  16  19
安徽    17  11   9   3
广东    18  12  15  21
.....

这里我们将顾客类型进行了细分,有女性会员、男性会员等等,那么同理,对于行索引我们也可以指定多个,这里也就不过多进行演示。

有时候我们想要改变行索引的名称或者是列方向的名称,我们则可以这么做

pd.crosstab(df['省份'], df['顾客类型'],colnames = ['顾客的类型'],rownames = ['各省份名称'])

output

顾客的类型  会员   普通
各省份名称
上海    124  115
北京    116  127
四川     26   35
安徽     28   12
广东     30   36

要是我们想在行方向以及列方向上加一个汇总的列,就需要用到crosstab()方法当中的margin参数,如下

pd.crosstab(df['省份'], df['顾客类型'], margins = True)

output

顾客类型   会员   普通   All
省份
上海    124  115   239
北京    116  127   243
.....
江苏     18   15    33
浙江    119  111   230
黑龙江    14   17    31
All   501  499  1000

你也可以给汇总的那一列重命名,用到的是margins_name参数,如下

pd.crosstab(df['省份'], df['顾客类型'],margins = True, margins_name="汇总")

output

顾客类型   会员   普通   汇总
省份
上海    124  115   239
北京    116  127   243
.....
江苏     18   15    33
浙江    119  111   230
黑龙江    14   17    31
汇总   501  499  1000

而如果我们需要的数值是百分比的形式,那么就需要用到normalize参数,如下

pd.crosstab(df['省份'], df['顾客类型'],normalize=True)

output

顾客类型     会员     普通
省份
上海    0.124  0.115
北京    0.116  0.127
四川    0.026  0.035
安徽    0.028  0.012
广东    0.030  0.036
.......

要是我们更加倾向于是百分比,并且保留两位小数,则可以这么来做

pd.crosstab(df['省份'], df['顾客类型'],normalize=True).style.format('{:.2%}')

output

顾客类型  会员   普通
省份
上海     12.4%   11.5%
北京     11.6%   12.7%
四川     26%     35%
安徽     28%     12%
广东     30%     36%
.......

下面我们指定聚合函数,并且作用在我们指定的列上面,用到的参数是aggfunc参数以及values参数,代码如下

pd.crosstab(df['省份'], df['顾客类型'],values = df["总收入"],aggfunc = "mean")

output

顾客类型         会员         普通
省份
上海    15.648738  15.253248
北京    14.771259  14.354390
四川    20.456135  14.019029
安徽    10.175893  11.559917
广东    14.757083  18.331903
.......

如上所示,我们所要计算的是地处“上海”并且是“会员”顾客的总收入的平均值,除了平均值之外,还有其他的聚合函数,如np.sum加总或者是np.median求取平均值。

我们还可以指定保留若干位的小数,使用round()函数

df_1 = pd.crosstab(df['省份'], df['顾客类型'],values=df["总收入"],aggfunc="mean").round(2)

output

顾客类型     会员     普通
省份
上海    15.65  15.25
北京    14.77  14.35
四川    20.46  14.02
安徽    10.18  11.56
广东    14.76  18.33
.......

时间类型数据的转化

对于很多数据分析师而言,在进行数据预处理的时候,需要将不同类型的数据转换成时间格式的数据,我们来看一下具体是怎么来进行

首先是将整形的时间戳数据转换成时间类型,看下面的例子

df = pd.DataFrame({'date': [1470195805, 1480195805, 1490195805],'value': [2, 3, 4]})
pd.to_datetime(df['date'], unit='s')

output

0   2016-08-03 03:43:25
1   2016-11-26 21:30:05
2   2017-03-22 15:16:45
Name: date, dtype: datetime64[ns]

上面的例子是精确到秒,我们也可以精确到天,代码如下

df = pd.DataFrame({'date': [1470, 1480, 1490],'value': [2, 3, 4]})
pd.to_datetime(df['date'], unit='D')

output

0   1974-01-10
1   1974-01-20
2   1974-01-30
Name: date, dtype: datetime64[ns]

下面则是将字符串转换成时间类型的数据,调用的也是pd.to_datetime()方法

pd.to_datetime('2022/01/20', format='%Y/%m/%d')

output

Timestamp('2022-01-20 00:00:00')

亦或是

pd.to_datetime('2022/01/12 11:20:10',format='%Y/%m/%d %H:%M:%S')

output

Timestamp('2022-01-12 11:20:10')

这里着重介绍一下Python当中的时间日期格式化符号

  • %y 两位数的年份表示(00-99)

  • %Y 四位数的年份表示(000-9999)

  • %m 表示的是月份(01-12)

  • %d 表示的是一个月当中的一天(0-31)

  • %H 表示的是24小时制的小时数

  • %I 表示的是12小时制的小时数

  • %M 表示的是分钟数 (00-59)

  • %S 表示的是秒数(00-59)

  • %w 表示的是星期数,一周当中的第几天,从星期天开始算

  • %W 表示的是一年中的星期数

当然我们进行数据类型转换遇到错误的时候,pd.to_datetime()方法当中的errors参数就可以派上用场,

df = pd.DataFrame({'date': ['3/10/2000', 'a/11/2000', '3/12/2000'],'value': [2, 3, 4]})
# 会报解析错误
df['date'] = pd.to_datetime(df['date'])

output

我们来看一下errors参数的作用,代码如下

df['date'] = pd.to_datetime(df['date'], errors='ignore')
df

output

date      value
0 3/10/2000   2
1 a/11/2000   3
2 3/12/2000   4

或者将不准确的值转换成NaT,代码如下

df['date'] = pd.to_datetime(df['date'], errors='coerce')
df

output

date       value
0 2000-03-10   2
1 NaT          3
2 2000-03-12   4

数值类型的转换

接下来我们来看一下其他数据类型往数值类型转换所需要经过的步骤,首先我们先创建一个DataFrame数据集,如下

df = pd.DataFrame({'string_col': ['1','2','3','4'],'int_col': [1,2,3,4],'float_col': [1.1,1.2,1.3,4.7],'mix_col': ['a', 2, 3, 4],'missing_col': [1.0, 2, 3, np.nan],'money_col': ['£1,000.00','£2,400.00','£2,400.00','£2,400.00'],'boolean_col': [True, False, True, True],'custom': ['Y', 'Y', 'N', 'N']})

output

我们先来查看一下每一列的数据类型

df.dtypes

output

string_col      object
int_col          int64
float_col      float64
mix_col         object
missing_col    float64
money_col       object
boolean_col       bool
custom          object
dtype: object

可以看到有各种类型的数据,包括了布尔值、字符串等等,或者我们可以调用df.info()方法来调用,如下

df.info()

output

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 8 columns):#   Column       Non-Null Count  Dtype
---  ------       --------------  -----  0   string_col   4 non-null      object 1   int_col      4 non-null      int64  2   float_col    4 non-null      float643   mix_col      4 non-null      object 4   missing_col  3 non-null      float645   money_col    4 non-null      object 6   boolean_col  4 non-null      bool   7   custom       4 non-null      object
dtypes: bool(1), float64(2), int64(1), object(4)
memory usage: 356.0+ bytes

我们先来看一下从字符串到整型数据的转换,代码如下

df['string_col'] = df['string_col'].astype('int')
df.dtypes

output

string_col       int32
int_col          int64
float_col      float64
mix_col         object
missing_col    float64
money_col       object
boolean_col       bool
custom          object
dtype: object

看到数据是被转换成了int32类型,当然我们指定例如astype('int16')astype('int8')或者是astype('int64'),当我们碰到量级很大的数据集时,会特别的有帮助。

那么类似的,我们想要转换成浮点类型的数据,就可以这么来做

df['string_col'] = df['string_col'].astype('float')
df.dtypes

output

string_col     float64
int_col          int64
float_col      float64
mix_col         object
missing_col    float64
money_col       object
boolean_col       bool
custom          object
dtype: object

同理我们也可以指定转换成astype('float16')astype('float32')或者是astype('float128')

而如果数据类型的混合的,既有整型又有字符串的,正常来操作就会报错,如下

df['mix_col'] = df['mix_col'].astype('int')

output

当中有一个字符串的数据"a",这个时候我们可以调用pd.to_numeric()方法以及里面的errors参数,代码如下

df['mix_col'] = pd.to_numeric(df['mix_col'], errors='coerce')
df.head()

output

我们来看一下各列的数据类型

df.dtypes

output

string_col     float64
int_col          int64
float_col      float64
mix_col        float64
missing_col    float64
money_col       object
boolean_col       bool
custom          object
dtype: object

"mix_col"这一列的数据类型被转换成了float64类型,要是我们想指定转换成我们想要的类型,例如

df['mix_col'] = pd.to_numeric(df['mix_col'], errors='coerce').astype('Int64')
df['mix_col'].dtypes

output

Int64Dtype()

而对于"money_col"这一列,在字符串面前有一个货币符号,并且还有一系列的标签符号,我们先调用replace()方法将这些符号给替换掉,然后再进行数据类型的转换

df['money_replace'] = df['money_col'].str.replace('£', '').str.replace(',','')
df['money_replace'] = pd.to_numeric(df['money_replace'])
df['money_replace']

output

0    1000.0
1    2400.0
2    2400.0
3    2400.0
Name: money_replace, dtype: float64

要是你熟悉正则表达式的话,也可以通过正则表达式的方式来操作,通过调用regex=True的参数,代码如下

df['money_regex'] = df['money_col'].str.replace('[\£\,]', '', regex=True)
df['money_regex'] = pd.to_numeric(df['money_regex'])
df['money_regex']

另外我们也可以通过astype()方法,对多个列一步到位进行数据类型的转换,代码如下

df = df.astype({'string_col': 'float16','int_col': 'float16'
})

或者在第一步数据读取的时候就率先确定好数据类型,代码如下

df = pd.read_csv('dataset.csv', dtype={'string_col': 'float16','int_col': 'float16'}
)
往期精彩回顾适合初学者入门人工智能的路线及资料下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载本站qq群955171419,加入微信群请扫码:

【Python】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单相关推荐

  1. 【原创干货】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单...

    上两篇原创的文章,小编主要是讲了数据可视化方面的内容,但是好像看得人不是很多的样子(搞得小编心里拔凉拔凉的....) [硬核干货]4500字.10个案例分享几个Python可视化小技巧,助你绘制高质量 ...

  2. 22个案例详解Pandas数据分析/预处理时的实用技巧,超简单

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编打算来讲一讲数据分析方面的内容,整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货,我们大致会说 Pandas计算交叉列表 Pand ...

  3. 22个案例详解 Pandas 数据分析/预处理时的实用技巧,超简单

    作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编打算来讲一讲数据分析方面的内容,整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货,我们大致会说 Pandas计算交叉列表 Pand ...

  4. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  5. python职能-python随机模块22个函数详解(下)

    作者:小伍哥 来源: AI入门学习 这篇文章继续给大家介绍python中的随机模块,随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性.平时数据分析各种 ...

  6. python代码案例详解-新手必学Python爬虫之Scrapy框架案例详解

    Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内 ...

  7. python代码案例详解-Python综合应用名片管理系统案例详解

    本文实例讲述了Python综合应用名片管理系统.分享给大家供大家参考,具体如下: 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎 ...

  8. python代码案例详解-Python之入门基础字典案例详解,新手必学

    字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息.在字典中,名字叫做"键",对应的内容信息叫做 "值".字典就是一个键/值对的集合. 它 ...

  9. 【精华总结】全文4000字、20个案例详解Pandas当中的数据统计分析与排序

    今天小编来给大家讲一下Pandas模块当中的数据统计与排序,说到具体的就是value_counts()方法以及sort_values()方法. value_counts()方法,顾名思义,主要是用于计 ...

最新文章

  1. ADC中宽带巴伦的使用
  2. (转) 设置sqlplus中的退格键
  3. chroma_format_idc表示的色度采样结构
  4. java虚拟机采用UTF-16编码格式对字符进行编码
  5. 5 获取当前访问的控制名称_LabVIEW编程技巧:网络通信中如何获取计算机名称、IP地址等信息...
  6. iPhone 14“感叹号”设计没跑:屏下Face ID要等到2024年
  7. 调整步长支持跨数据库的ID唯一性弊端
  8. VGG16 、VGG19 、ResNet50 、Inception V3 、Xception介绍
  9. Python 如何在csv中定位非数字和字母的符号
  10. Prometheus 原理和实践,含docker部署Prometheus、node Exporters、Alertmanager、Push Gateway、grafana
  11. 修改linux系统的open files参数
  12. HDU_1874_畅通工程续_最短路问题
  13. oracle DBTIMEZONE时区调整
  14. python计算勾股定理公式_三角函数、公式、勾股定理、三角形
  15. 先进驾驶员辅助系统ADSA
  16. Mapped Statements collection already contains value
  17. 苹果 2017 秋季产品发布会直播预告
  18. 初步使用计算机的教学反思,静夜思教学反思(精选10篇)
  19. Protel 常用问题总结
  20. 魔兽世界怀旧服2020年最新服务器列表,2020年2月15日魔兽世界怀旧服服务器的排队等待时间的真实数据...

热门文章

  1. Codevs 3134 Circle
  2. java 中的2个接口 Comparable和Comparator
  3. 背景全透明 background: transparent
  4. 剖析SQL Server执行计划
  5. 一定要搜藏的20个非常有用的PHP类库
  6. 【Oracle】PL/SQL Developer使用技巧(持续更新中)
  7. linux命令学习之:ifconfig
  8. Android开发(七)——判断网络状态
  9. 【转】使 用免费UMS架设Flash流媒体服务
  10. 历史客人-报表记录信息