作者:俊欣
来源:关于数据分析与可视化
今天小编打算来讲一讲数据分析方面的内容,整理和总结一下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
在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的需求持续飙升。世界经济论坛发布的《未来就业报告》, ...
2025-03-28你有没有遇到过这样的情况?流量进来了,转化率却不高,辛辛苦苦拉来的用户,最后大部分都悄无声息地离开了,这时候漏斗分析就非 ...
2025-03-27TensorFlow Datasets(TFDS)是一个用于下载、管理和预处理机器学习数据集的库。它提供了易于使用的API,允许用户从现有集合中 ...
2025-03-26"不谋全局者,不足谋一域。"在数据驱动的商业时代,战略级数据分析能力已成为职场核心竞争力。《CDA二级教材:商业策略数据分析 ...
2025-03-26当你在某宝刷到【猜你喜欢】时,当抖音精准推来你的梦中情猫时,当美团外卖弹窗刚好是你想吃的火锅店…… 恭喜你,你正在被用户 ...
2025-03-26当面试官问起随机森林时,他到底在考察什么? ""请解释随机森林的原理""——这是数据分析岗位面试中的经典问题。但你可能不知道 ...
2025-03-25在数字化浪潮席卷的当下,数据俨然成为企业的命脉,贯穿于业务运作的各个环节。从线上到线下,从平台的交易数据,到门店的运营 ...
2025-03-25在互联网和移动应用领域,DAU(日活跃用户数)是一个耳熟能详的指标。无论是产品经理、运营,还是数据分析师,DAU都是衡量产品 ...
2025-03-24ABtest做的好,产品优化效果差不了!可见ABtest在评估优化策略的效果方面地位还是很高的,那么如何在业务中应用ABtest? 结合企业 ...
2025-03-21在企业数据分析中,指标体系是至关重要的工具。不仅帮助企业统一数据标准、提升数据质量,还能为业务决策提供有力支持。本文将围 ...
2025-03-20解锁数据分析师高薪密码,CDA 脱产就业班助你逆袭! 在数字化浪潮中,数据驱动决策已成为企业发展的核心竞争力,数据分析人才的 ...
2025-03-19在 MySQL 数据库中,查询一张表但是不包含某个字段可以通过以下两种方法实现:使用 SELECT 子句以明确指定想要的字段,或者使 ...
2025-03-17在当今数字化时代,数据成为企业发展的关键驱动力,而用户画像作为数据分析的重要成果,改变了企业理解用户、开展业务的方式。无 ...
2025-03-172025年是智能体(AI Agent)的元年,大模型和智能体的发展比较迅猛。感觉年初的deepseek刚火没多久,这几天Manus又成为媒体头条 ...
2025-03-14以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-13以下的文章内容来源于刘静老师的专栏,如果您想阅读专栏《10大业务分析模型突破业务瓶颈》,点击下方链接 https://edu.cda.cn/go ...
2025-03-12以下的文章内容来源于柯家媛老师的专栏,如果您想阅读专栏《小白必备的数据思维课》,点击下方链接 https://edu.cda.cn/goods/sh ...
2025-03-11随着数字化转型的加速,企业积累了海量数据,如何从这些数据中挖掘有价值的信息,成为企业提升竞争力的关键。CDA认证考试体系应 ...
2025-03-10推荐学习书籍 《CDA一级教材》在线电子版正式上线CDA网校,为你提供系统、实用、前沿的学习资源,助你轻松迈入数据分析的大门! ...
2025-03-07在数据驱动决策的时代,掌握多样的数据分析方法,就如同拥有了开启宝藏的多把钥匙,能帮助我们从海量数据中挖掘出关键信息,本 ...
2025-03-06