京公网安备 11010802034615号
经营许可证编号:京B2-20210330
作者:俊欣
来源:关于数据分析与可视化
今天小编打算来讲一讲数据分析方面的内容,整理和总结一下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
B+树作为数据库索引的核心数据结构,其高效的查询、插入、删除性能,离不开节点间指针的合理设计。在日常学习和数据库开发中,很 ...
2026-01-30在数据库开发中,UUID(通用唯一识别码)是生成唯一主键、唯一标识的常用方式,其标准格式包含4个短横线(如550e8400-e29b-41d4- ...
2026-01-30商业数据分析的价值落地,离不开标准化、系统化的总体流程作为支撑;而CDA(Certified Data Analyst)数据分析师,作为经过系统 ...
2026-01-30在数据分析、质量控制、科研实验等场景中,数据波动性(离散程度)的精准衡量是判断数据可靠性、稳定性的核心环节。标准差(Stan ...
2026-01-29在数据分析、质量检测、科研实验等领域,判断数据间是否存在本质差异是核心需求,而t检验、F检验是实现这一目标的经典统计方法。 ...
2026-01-29统计制图(数据可视化)是数据分析的核心呈现载体,它将抽象的数据转化为直观的图表、图形,让数据规律、业务差异与潜在问题一目 ...
2026-01-29箱线图(Box Plot)作为数据分布可视化的核心工具,能清晰呈现数据的中位数、四分位数、异常值等关键统计特征,广泛应用于数据分 ...
2026-01-28在回归分析、机器学习建模等数据分析场景中,多重共线性是高频数据问题——当多个自变量间存在较强的线性关联时,会导致模型系数 ...
2026-01-28数据分析的价值落地,离不开科学方法的支撑。六种核心分析方法——描述性分析、诊断性分析、预测性分析、规范性分析、对比分析、 ...
2026-01-28在机器学习与数据分析领域,特征是连接数据与模型的核心载体,而特征重要性分析则是挖掘数据价值、优化模型性能、赋能业务决策的 ...
2026-01-27关联分析是数据挖掘领域中挖掘数据间潜在关联关系的经典方法,广泛应用于零售购物篮分析、电商推荐、用户行为路径挖掘等场景。而 ...
2026-01-27数据分析的基础范式,是支撑数据工作从“零散操作”走向“标准化落地”的核心方法论框架,它定义了数据分析的核心逻辑、流程与目 ...
2026-01-27在数据分析、后端开发、业务运维等工作中,SQL语句是操作数据库的核心工具。面对复杂的表结构、多表关联逻辑及灵活的查询需求, ...
2026-01-26支持向量机(SVM)作为机器学习中经典的分类算法,凭借其在小样本、高维数据场景下的优异泛化能力,被广泛应用于图像识别、文本 ...
2026-01-26在数字化浪潮下,数据分析已成为企业决策的核心支撑,而CDA数据分析师作为标准化、专业化的数据人才代表,正逐步成为连接数据资 ...
2026-01-26数据分析的核心价值在于用数据驱动决策,而指标作为数据的“载体”,其选取的合理性直接决定分析结果的有效性。选对指标能精准定 ...
2026-01-23在MySQL查询编写中,我们习惯按“SELECT → FROM → WHERE → ORDER BY”的语法顺序组织语句,直觉上认为代码顺序即执行顺序。但 ...
2026-01-23数字化转型已从企业“可选项”升级为“必答题”,其核心本质是通过数据驱动业务重构、流程优化与模式创新,实现从传统运营向智能 ...
2026-01-23CDA持证人已遍布在世界范围各行各业,包括世界500强企业、顶尖科技独角兽、大型金融机构、国企事业单位、国家行政机关等等,“CDA数据分析师”人才队伍遵守着CDA职业道德准则,发挥着专业技能,已成为支撑科技发展的核心力量。 ...
2026-01-22在数字化时代,企业积累的海量数据如同散落的珍珠,而数据模型就是串联这些珍珠的线——它并非简单的数据集合,而是对现实业务场 ...
2026-01-22