作者:俊欣
来源:关于数据分析与可视化
今天小编打算来讲一讲数据分析方面的内容,整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货,我们大致会说
首先我们来讲一下Pandas模块当中的crosstab()函数,它的作用主要是进行分组之后的信息统计,里面会用到聚合函数,默认的是统计行列组合出现的次数,参数如下
pandas.crosstab(index, columns, values=None,
rownames=None,
colnames=None,
aggfunc=None,
margins=False,
margins_name='All',
dropna=True,
normalize=False)
下面小编来解释一下里面几个常用的函数
我们通过几个例子来进一步理解corss_tab()函数的作用,我们先导入要用到的模块并且读取数据集
import pandas as pd 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
顾客类型 会员 普通 省份 上海 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当中的时间日期格式化符号
当然我们进行数据类型转换遇到错误的时候,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 float64 3 mix_col 4 non-null object 4 missing_col 3 non-null float64 5 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' }
)
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据分析领域,Excel作为一种普及率极高且功能强大的工具,无疑为无数专业人士提供了便捷的解决方案。尽管Excel自带了丰富的功 ...
2025-01-17在这个瞬息万变的时代,许多人都在寻找能让他们脱颖而出的职业。而数据分析师,作为大数据和人工智能时代的热门职业,自然吸引了 ...
2025-01-14Python作为一门功能强大的编程语言,已经成为数据分析和可视化领域的重要工具。无论你是数据分析的新手,还是经验丰富的专业人士 ...
2025-01-10完全靠数据决策,真的靠谱吗? 最近几年,“数据驱动”成了商界最火的关键词之一,但靠数据就能走天下?其实不然!那些真正成功 ...
2025-01-09SparkSQL 结构化数据处理流程及原理是什么?Spark SQL 可以使用现有的Hive元存储、SerDes 和 UDF。它可以使用 JDBC/ODB ...
2025-01-09在如今这个信息爆炸的时代,数据已然成为企业的生命线。无论是科技公司还是传统行业,数据分析正在深刻地影响着商业决策以及未来 ...
2025-01-08“数据为王”相信大家都听说过。当前,数据信息不再仅仅是传递的媒介,它成为了驱动经济发展的新燃料。对于企业而言,数据指标体 ...
2025-01-07在职场中,当你遇到问题的时候,如果感到无从下手,或者抓不到重点,可能是因为你掌握的思维模型不够多。 一个好用的思维模型, ...
2025-01-06在现代企业中,数据分析师扮演着至关重要的角色。每天都有大量数据涌入,从社交媒体到交易平台,数据以空前的速度和规模生成。面 ...
2025-01-06在职场中,许多言辞并非表面意思那么简单,有时需要听懂背后的“潜台词”。尤其在数据分析的领域里,掌握常用术语就像掌握一门新 ...
2025-01-04在当今信息化社会,数据分析已成为各行各业的核心驱动力。它不仅仅是对数字进行整理与计算,而是在数据的海洋中探寻规律,从而指 ...
2025-01-03又到一年年终时,各位打工人也迎来了展示成果的关键时刻 —— 年终述职。一份出色的年终述职报告,不仅能全面呈现你的工作价值, ...
2025-01-03在竞争激烈的商业世界中,竞品分析对于企业的发展至关重要。今天,我们就来详细聊聊数据分析师写竞品分析的那些事儿。 一、明确 ...
2025-01-03在数据分析的江湖里,有两个阵营总是争论不休。一派信奉“大即是美”,认为数据越多越好;另一派坚守“小而精”,力挺质量胜于规 ...
2025-01-02数据分析是一个复杂且多维度的过程,从数据收集到分析结果应用,每一步都是对信息的提炼与升华。可视化分析结果,以图表的形式展 ...
2025-01-02在当今的数字化时代,数据分析师扮演着一个至关重要的角色。他们如同现代企业的“解密专家”,通过解析数据为企业提供决策支持。 ...
2025-01-02数据分析报告至关重要 一份高质量的数据分析报告不仅能够揭示数据背后的真相,还能为企业决策者提供有价值的洞察和建议。 年薪 ...
2024-12-31数据分析,听起来好像是技术大咖的专属技能,但其实是一项人人都能学会的职场硬核能力!今天,我们来聊聊数据分析的核心流程,拆 ...
2024-12-31提到数据分析,你脑海里可能会浮现出一群“数字控”抱着电脑,在海量数据里疯狂敲代码的画面。但事实是,数据分析并没有你想象的 ...
2024-12-31关于数据分析师是否会成为失业高危职业,近年来的讨论层出不穷。在这个快速变化的时代,技术进步让人既兴奋又不安。今天,我们从 ...
2024-12-30