• 元宇宙:本站分享元宇宙相关资讯,资讯仅代表作者观点与平台立场无关,仅供参考.

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

  • AI科技大本营
  • 2022年1月19日06时
作者 | 俊欣
来源 | 关于数据分析与可视化
今天小编打算来讲一讲数据分析方面的内容,整理和总结一下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()函数的作用,我们先导入要用到的模块并且读取数据集
importpandasaspd

df=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
顾客类型会员普通
省份
上海124115
北京116127
四川2635
安徽2812
广东3036
.......
这里我们将省份指定为行索引,将会员类型指定为列,其中顾客类型有“会员”、“普通”两种,举例来说,四川省的会员顾客有26名,普通顾客有35名。
当然我们这里只是指定了一个列,也可以指定多个,代码如下
pd.crosstab(df['省份'],[df['顾客类型'],df["性别"]])
output
顾客类型会员普通
性别女性男性女性男性
省份
上海67575362
北京53635968
四川1791619
安徽171193
广东18121521
.....
这里我们将顾客类型进行了细分,有女性会员、男性会员等等,那么同理,对于行索引我们也可以指定多个,这里也就不过多进行演示。
有时候我们想要改变行索引的名称或者是列方向的名称,我们则可以这么做
pd.crosstab(df['省份'],df['顾客类型'],
colnames=['顾客的类型'],
rownames=['各省份名称'])
output
顾客的类型会员普通
各省份名称
上海124115
北京116127
四川2635
安徽2812
广东3036
要是我们想在行方向以及列方向上加一个汇总的列,就需要用到crosstab()方法当中的margin参数,如下
pd.crosstab(df['省份'],df['顾客类型'],margins=True)
output
顾客类型会员普通All
省份
上海124115239
北京116127243
.....
江苏181533
浙江119111230
黑龙江141731
All5014991000
你也可以给汇总的那一列重命名,用到的是margins_name参数,如下
pd.crosstab(df['省份'],df['顾客类型'],
margins=True,margins_name="汇总")
output
顾客类型会员普通汇总
省份
上海124115239
北京116127243
.....
江苏181533
浙江119111230
黑龙江141731
汇总5014991000
而如果我们需要的数值是百分比的形式,那么就需要用到normalize参数,如下
pd.crosstab(df['省份'],df['顾客类型'],
normalize=True)
output
顾客类型会员普通
省份
上海0.1240.115
北京0.1160.127
四川0.0260.035
安徽0.0280.012
广东0.0300.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.64873815.253248
北京14.77125914.354390
四川20.45613514.019029
安徽10.17589311.559917
广东14.75708318.331903
.......
如上所示,我们所要计算的是地处“上海”并且是“会员”顾客的总收入的平均值,除了平均值之外,还有其他的聚合函数,如np.sum加总或者是np.median求取平均值。
我们还可以指定保留若干位的小数,使用round()函数
df_1=pd.crosstab(df['省份'],df['顾客类型'],
values=df["总收入"],
aggfunc="mean").round(2)
output
顾客类型会员普通
省份
上海15.6515.25
北京14.7714.35
四川20.4614.02
安徽10.1811.56
广东14.7618.33
.......

时间类型数据的转化

对于很多数据分析师而言,在进行数据预处理的时候,需要将不同类型的数据转换成时间格式的数据,我们来看一下具体是怎么来进行
首先是将整形的时间戳数据转换成时间类型,看下面的例子
df=pd.DataFrame({'date':[1470195805,1480195805,1490195805],
'value':[2,3,4]})
pd.to_datetime(df['date'],unit='s')
output
02016-08-0303:43:25
12016-11-2621:30:05
22017-03-2215: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
01974-01-10
11974-01-20
21974-01-30
Name:date,dtype:datetime64[ns]
下面则是将字符串转换成时间类型的数据,调用的也是pd.to_datetime()方法
pd.to_datetime('2022/01/20',format='%Y/%m/%d')
output
Timestamp('2022-01-2000:00:00')
亦或是
pd.to_datetime('2022/01/1211:20:10',
format='%Y/%m/%d%H:%M:%S')
output
Timestamp('2022-01-1211: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
datevalue
03/10/20002
1a/11/20003
23/12/20004
或者将不准确的值转换成NaT,代码如下
df['date']=pd.to_datetime(df['date'],errors='coerce')
df
output
datevalue
02000-03-102
1NaT3
22000-03-124

数值类型的转换

接下来我们来看一下其他数据类型往数值类型转换所需要经过的步骤,首先我们先创建一个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_colobject
int_colint64
float_colfloat64
mix_colobject
missing_colfloat64
money_colobject
boolean_colbool
customobject
dtype:object
可以看到有各种类型的数据,包括了布尔值、字符串等等,或者我们可以调用df.info()方法来调用,如下
df.info()
output
<class'pandas.core.frame.DataFrame'>
RangeIndex:4entries,0to3
Datacolumns(total8columns):
#ColumnNon-NullCountDtype
----------------------------
0string_col4non-nullobject
1int_col4non-nullint64
2float_col4non-nullfloat64
3mix_col4non-nullobject
4missing_col3non-nullfloat64
5money_col4non-nullobject
6boolean_col4non-nullbool
7custom4non-nullobject
dtypes:bool(1),float64(2),int64(1),object(4)
memoryusage:356.0+bytes
我们先来看一下从字符串到整型数据的转换,代码如下
df['string_col']=df['string_col'].astype('int')
df.dtypes
output
string_colint32
int_colint64
float_colfloat64
mix_colobject
missing_colfloat64
money_colobject
boolean_colbool
customobject
dtype:object
看到数据是被转换成了int32类型,当然我们指定例如astype('int16')astype('int8')或者是astype('int64'),当我们碰到量级很大的数据集时,会特别的有帮助。
那么类似的,我们想要转换成浮点类型的数据,就可以这么来做
df['string_col']=df['string_col'].astype('float')
df.dtypes
output
string_colfloat64
int_colint64
float_colfloat64
mix_colobject
missing_colfloat64
money_colobject
boolean_colbool
customobject
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_colfloat64
int_colint64
float_colfloat64
mix_colfloat64
missing_colfloat64
money_colobject
boolean_colbool
customobject
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
01000.0
12400.0
22400.0
32400.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'
}
)

技术

用python写3D游戏,太赞了

资讯

算力超越iPhone,芯片堪比Mac

技术

31个好用的Python字符串方法

资讯

GPT-3平替版语言模型,性能更优化


分享

点收藏

点点赞

点在看

Copyright © 2021.Company 元宇宙YITB.COM All rights reserved.元宇宙YITB.COM