前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据导入与预处理-课程总结-04~06章

数据导入与预处理-课程总结-04~06章

作者头像
用户2225445
发布2022-11-18 15:13:56
13K0
发布2022-11-18 15:13:56
举报
文章被收录于专栏:IT从业者张某某IT从业者张某某

数据导入与预处理-课程总结-04~06章

💯数据导入与预处理-课程总结-资料汇总贴

1. 第4章 pandas数据获取

完整参考:

💯数据导入与预处理-第4章-pandas数据获取

1.1 数据获取

1.1.1 概述

数据经过采集后通常会被存储到Word、Excel、JSON等文件或数据库中,从而为后期的预处理工作做好数据储备。数据获取是数据预处理的第一步操作,主要是从不同的渠道中读取数据。Pandas支持CSV、TXT、Excel、JSON这几种格式文件、HTML表格的读取操作,另外Python可借助第三方库实现Word与PDF文件的读取操作。本章主要为大家介绍如何从多个渠道中获取数据,为预处理做好数据准备。

1.1.2 从CSV和TXT文件获取数据

代码语言:javascript
复制
read_csv(filepath_or_buffer,sep=',', delimiter=None, 
               header='infer', names=None, index_col=None, usecols=None, 
               squeeze=False, prefix=None, mangle_dupe_cols=True, encoding=None...)

filepath_or_buffe:表示文件的路径,可以取值为有效的路径字符串、路径对象或类似文件的对象。 sep:表示指定的分隔符,默认为“,”。 header:表示指定文件中的哪一行数据作为DataFrame类对象的列索引,默认为0,即第一行数据作为列索引。 names:表示DataFrame类对象的列索引列表,当names没被赋值时,header会变成0,即选取数据文件的第一行作为列名;当 names 被赋值,header 没被赋值时,那么header会变成None。如果都赋值,就会实现两个参数的组合功能。 encoding:表示指定的编码格式。 读取csv案例-指定sep,encoding,engine

案例

代码语言:javascript
复制
import pandas as pd
evaluation_data = pd.read_csv(
       "phones.csv", sep=',',encoding='gbk',engine = 'python')
print(evaluation_data)
代码语言:javascript
复制
engine:使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。
encoding:指定字符集类型,即编码,通常指定为’utf-8’

1.1.3 读取Excel文件

Excel文件(Excel 2007及以上版本的扩展名为.xlsx)是日常工作中经常使用的,该文件主要以工作表存储数据,工作表中包含排列成行和列的单元格。Excel文件中默认有3个工作表,用户可根据需要添加一定个数(因可用内存的限制)的工作表。

Pandas中使用read_excel()函数读取Excel文件中指定工作表的数据,并将数据转换成一个结构与工作表相似的DataFrame类对象。

代码语言:javascript
复制
pandas.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
        usecols=None,squeeze=False, dtype=None, engine=None,converters=None,
        true_values=None, false_values=None, skiprows=None, nrows=None,na_values=None, 
        parse_dates=False, date_parser=None,thousands=None, comment=None, 
        skipfooter=0,convert_float=True,**kwds)

sheet_name:表示要读取的工作表,默认值为0。 header:表示指定文件中的哪一行数据作为DataFrame类对象的列索引。 names:表示DataFrame类对象的列索引列表。

案例

代码语言:javascript
复制
data3 = pd.read_excel('Athletes_info.xlsx',sheet_name='Sheet1',header=0,engine='openpyxl')

上述代码会读取Athletes_info.xlsx文件中的Sheet1,header=0表示取第1行为列字段,采用openpyxl作为读取excel的引擎。

1.1.4 读取json文件

掌握read_json()函数的用法,可以熟练地使用该方法从JSON文件中获取数据

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以简洁和清晰的层次结构来组织数据,易于被人们阅读和编写。JSON采用独立于编程语言的文本格式来存储数据,其文件的后缀名为.json,可通过文本编辑工具查看。

Pandas中使用read_json()函数读取JSON文件的数据,并将数据转换成一个DataFrame类对象。

代码语言:javascript
复制
pandas.read_json(path_or_buf=None, orient=None, typ='frame', dtype=None,
         convert_axes=None, convert_dates=True, keep_default_dates=True,
         numpy=False, precise_float=False, date_unit=None, encoding=None,
         lines=False, chunksize=None, compression='infer')

案例

代码语言:javascript
复制
strtext='[{"ttery":"min","issue":"20130801-3391","code":"8,4,5,2,9","code1":"297734529","code2":null,"time":1013395466000},\
{"ttery":"min","issue":"20130801-3390","code":"7,8,2,1,2","code1":"298058212","code2":null,"time":1013395406000},\
{"ttery":"min","issue":"20130801-3389","code":"5,9,1,2,9","code1":"298329129","code2":null,"time":1013395346000},\
{"ttery":"min","issue":"20130801-3388","code":"3,8,7,3,3","code1":"298588733","code2":null,"time":1013395286000},\
{"ttery":"min","issue":"20130801-3387","code":"0,8,5,2,7","code1":"298818527","code2":null,"time":1013395226000}]'
 
df=pd.read_json(strtext,orient='records')

输出为:

1.1.5 读取sql数据

代码语言:javascript
复制
from sqlalchemy import create_engine  
import pandas as pd
# 配置数据库信息
db_info = {'user':'root',  
    'pwd':'XXXX',  # 修改为你的密码
    'host':'localhost',  
    'database':'XXX'  # 这里我们事先指定了数据库,后续操作只需要表即可
}  
#这里直接使用pymysql连接,echo=True,会显示在加载数据库所执行的SQL语句。      
engine = create_engine('mysql+pymysql://%(user)s:%(pwd)s@%(host)s/%(database)s?charset=utf8' % db_info,encoding='utf-8')  
# 执行sql查询,并把数据库连接作为参数传进来
data = pd.read_sql('SELECT dep_id, dep_name FROM dep_info', con = engine)
data

2. 第5章 数据清理

💯数据导入与预处理-第5章-数据清理

2.1 数据清理概述

2.1.1 数据清理概述

数据清理概述

缺失值的检测与处理 重复值的检测与处理 异常值的检测与处理

2.2 数据清理案例

2.1 缺失值处理

2.1.1 缺失值的检测与处理方法

缺失值的检测可以采用isnull()、notnull()、isna()和notna()方法的用法,可以熟练地使用这些方法来检测缺失值。

代码语言:javascript
复制
isnull()、notnull()、isna()和notna()方法均会返回一个由布尔值组成、与原对象形状相同的新对象
其中isnull()和isna()方法的用法相同,它们会在检测到缺失值的位置标记True;
notnull()和notna()方法的用法相同,它们会在检测到缺失值的位置标记False。

为避免包含缺失值的数据对分析预测结果产生一定的偏差,缺失值被检测出来之后一般不建议保留,而是选择适当的手段给予处理。缺失值的常见处理方式有三种:删除缺失值、填充缺失值和插补缺失值,pandas中为每种处理方式均提供了相应的方法。

2.1.2 删除缺失值

pandas中提供了删除缺失值的方法dropna(),dropna()方法用于删除缺失值所在的一行或一列数据,并返回一个删除缺失值后的新对象。

代码语言:javascript
复制
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None,inplace=False)

axis:表示是否删除包含缺失值的行或列。 how:表示删除缺失值的方式。 thresh:表示保留至少有N个非NaN值的行或列。 subset:表示删除指定列的缺失值。 inplace:表示是否操作原数据。

2.1.3填充缺失值

pandas中提供了填充缺失值的方法fillna(),fillna()方法既可以使用指定的数据填充,也可以使用缺失值前面或后面的数据填充。

代码语言:javascript
复制
DataFrame.fillna(value=None, method=None, axis=None, inplace=False,
                            limit=None, downcast=None)

method:表示填充的方式,默认值为None。该参数还支持 'pad’或’ffill’和’backfill’或’bfill’几种取值,其中’pad’或’ffill’表示将最后一个有效值向后传播,也就是说使用缺失值前面的有效值填充缺失值;'backfill’或’bfill’表示将最后一个有效值向前传播,也就是说使用缺失值后面的有效值填充缺失值。 limit:表示可以连续填充的最大数量。

2.1.4 插补缺失值

pandas中提供了插补缺失值的方法interpolate(),interpolate() 会根据相应的插值方法求得的值进行填充。

代码语言:javascript
复制
DataFrame.interpolate(method='linear', axis=0, limit=None, inplace=False,
        limit_direction=None, limit_area=None, downcast=None, **kwargs)

method:表示使用的插值方法,该参数支持’linear’(默认值)、‘time’、 ‘index’、‘values’、 ‘nearest’ 、'barycentric’共6种取值,其中’linear’代表采用线性插值法进行填充;'time’代表根据时间长短进行填充;‘index’、'values’代表采用索引的实际数值进行填充;'nearest’代表采用最临近插值法进行填充;'barycentric’代表采用重心坐标插值法进行填充。 limit_direction:表示按照指定方向对连续的NaN进行填充。

2.1.5 案例
代码语言:javascript
复制
import pandas as pd
import numpy as np
# 创建DataFrame
na_df = pd.DataFrame({'A':[1, 2, np.NaN, 4],
                          'B':[3, 4, 4, 5],
                          'C':[5, 6, 7, 8],
                          'D':[7, 5, np.NaN, np.NaN]})
                          
# 使用isna()方法检测na_df中是否存在缺失值
na_df.isna()

# 计算每列缺失值的总和
na_df.isnull().sum()

# 看看缺失值所在的行
na_df[na_df.isnull().T.any()]

# 删除缺失值 -- 将缺失值出现的行全部删掉
na_df.dropna()

# 保留至少有3个非NaN值的行
na_df.dropna(thresh=3)

# 缺失值补全|整体填充 将全部缺失值替换为 *
na_df.fillna("*")

2.3 重复值处理

2.3.1 重复值的检测

pandas中使用duplicated()方法来检测数据中的重复值。

代码语言:javascript
复制
DataFrame.duplicated(subset=None, keep='first')

subset:表示识别重复项的列索引或列索引序列,默认标识所有的列索引。 keep:表示采用哪种方式保留重复项,该参数可以取值为’first’(默认值)、 'last '和 ‘False’,其中’first’代表删除重复项,仅保留第一次出现的数据项;'last '代表删除重复项,仅保留最后一次出现的数据项;'False’表示所有相同的数据都被标记为重复项。 duplicated()方法检测完数据后会返回一个由布尔值组成的Series类对象,该对象中若包含True,说明True对应的一行数据为重复项。

2.3.2 重复值的处理

重复值的一般处理方式是删除,pandas中使用drop_duplicates()方法删除重复值。

代码语言:javascript
复制
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, 
                                               ignore_index=False)

keep:表示采用哪种方式保留重复项,该参数可以取值为’first’(默认值)、 'last ‘和’False’,其中’first’代表删除重复项,仅保留第一次出现的数据项;'last '代表删除重复项,仅保留最后一次出现的数据项;'False’表示删除所有的重复项。 inplace:表示是否放弃副本数据,返回新的数据,默认为False。 ignore_index:表示是否对删除重复值后的对象的行索引重新排序,默认为Flase。

2.3.3 重复值处理案例

创建DataFrame对象:

代码语言:javascript
复制
# 创建DataFrame对象
import pandas as pd
import numpy as np

df = pd.DataFrame({'name': ['刘婷婷', '王淼', '彭岩', '刘华', '刘华', '周华'],
                'age': [24, 23, 29, 22, 22, 27],
                'height': [162, 165, 175, 175, 175, 178],
                'gender': ['女', '女', '男', '男', '男', '男']})
                
# 检测df对象中的重复值
df.duplicated()   # 返回boolean数组

# 查找重复值
# 将全部重复值所在的行筛选出来
df[df.duplicated()]

# 查找重复值|指定
# 上面是所有列完全重复的情况,但有时我们只需要根据某列查找重复值
df[df.duplicated(['gender'])]


# 删除全部的重复值
df.drop_duplicates()

# 删除重复值|指定
# 删除全部的重复值,但保留最后一次出现的值
df.drop_duplicates(keep = 'last')

2.4 异常值处理

2.4.1 异常值的检测

异常值的检测可以采用 3σ原则 和 箱形图检测。

1. 3σ原则

3σ原则,又称为拉依达原则,它是先假设一组检测数据只含有随机误差,对该组数据进行计算处理得到标准偏差,按一定概率确定一个区间,凡是超过这个区间的误差不属于随机误差而是粗大误差,含有粗大误差范围内的数据(视为异常值)应予以剔除。

3σ原则并不适用于任意数据集,而只适用于符合或近似正态分布的数据集。

正态分布也称高斯分布,是统计学中十分重要的概率分布,它有两个比较重要的参数:μ和σ,其中μ是遵从正态分布的随机变量(值无法预先确定仅以一定的概率取值的变量)的均值,σ是此随机变量的标准差。

结合正态分布曲线图,3σ原则在各区间所占的概率如下: 数值分布在(μ-σ,μ+σ)区间中的概率为68.2%。 数值分布在(μ-2σ,μ+2σ)区间中的概率为95.4%。 数值分布在(μ-3σ,μ+3σ)区间中的概率为99.7%。 大多数数值集中在(μ-3σ,μ+3σ)区间的概率最大,数值超出这个区间的概率仅占不到0.3%。所以,凡是误差超过(μ-3σ,μ+3σ)区间的数值均属于异常值。

2.箱型图检测

箱形图是一种用于显示一组数据分散情况的统计图,它通常由上边缘、上四分位数、中位数、下四分位数、下边缘和异常值组成。箱形图能直观地反映出一组数据的分散情况,一旦图中出现离群点(远离大多数值的点),就认为该离群点可能为异常值。

Q3表示上四分位数,说明全部检测值中有四分之一的值比它大; Q1表示下四分位数,说明全部检测值中有四分之一的值比它小; IQR表示四分位数间距,即上四分位数Q3与下四分位数Q1之差,其中包含了一半检测值; 空心圆点表示异常值,该值的范围通常为小于Q1 – 1.5IQR或大于Q3 + 1.5IQR

为了能够直观地从箱形图中查看异常值,pandas中提供了两个绘制箱形图的函数:plot()和boxplot(),其中plot()函数用于根据Series和DataFrame类对象绘制箱形图,该箱形图中默认不会显示网格线; boxplot()函数用于根据DataFrame类对象绘制箱形图,该箱形图中默认会显示网格线。

3. 第6章 数据集成变换规约

💯数据导入与预处理-第6章-数据集成

💯数据导入与预处理-第6章-02数据变换

💯数据导入与预处理-第6章-03数据规约

3.1 数据集成

3.1.1数据集成需要关注的问题

数据集成期间的数据问题,包括:

实体识别 冗余属性识别 元组重复等

3.2 基于Pandas实现数据集成

pandas中内置了许多能轻松地合并数据的函数与方法,通过这些函数与方法可以将Series类对象或DataFrame类对象进行符合各种逻辑关系的合并操作,合并后生成一个整合的Series或DataFrame类对象。基于这些方法实现主键合并数据、重叠合并数据和堆叠合并数据操作。

常用的合并数据的函数包括:

3.2.3 主键合并数据merge

主键合并数据类似于关系型数据库的连接操作,主要通过指定一个或多个键将两组数据进行连接,通常以两组数据中重复的列索引为合并键。

代码语言:javascript
复制
pd.merge(left, right, how='inner', on=None, left_on=None, 
        right_on=None, left_index=False, right_index=False, sort=False, 
        suffixes='_x', '_y', copy=True, indicator=False, validate=None)

参数含义如下:

left,right:参与合并的Series或DataFrame类对象。 how:表示数据合并的方式,支持’inner’(默认值)、‘left’、‘right’、'outer’共4个取值。 on:表示left与right合并的键。 sort:表示按键对应一列的顺序对合并结果进行排序,默认为True。 how参数的取值‘inner’代表基于left与right的共有的键合并,类似于数据库的内连接操作;'left’代表基于left的键合并,类似于数据库的左外连接操作;'right’代表基于right的键合并,类似于数据库的右外连接操作;'outer’代表基于所有left与right的键合并,类似于数据库的全外连接操作。

3.2.4 堆叠合并数据concat

堆叠合并数据类似于数据库中合并数据表的操作,主要沿着某个轴将多个对象进行拼接。

代码语言:javascript
复制
pandas.concat(objs, axis=0, join='outer', join_axes=None,
         ignore_index=False, keys=None, levels=None, names=None,
         verify_integrity=False, sort=None, copy=True)

参数含义如下:

join:表示合并的方式,可以取值为’inner’或’outer’(默认值),其中’inner’表示内连接,即合并结果为多个对象重叠部分的索引及数据,没有数据的位置填充为NaN;'outer’表示外连接,即合并结果为多个对象各自的索引及数据,没有数据的位置填充为NaN。 ignore_index:是否忽略索引,可以取值为True或False(默认值)。若设为True,则会在清除结果对象的现有索引后生成一组新的索引。

3.2.5 追加合并数据append

Pandas可以通过append实现纵向追加:

代码语言:javascript
复制
df1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
print(df1)

df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
print(df2)

# 纵向追加
df1.append(df2, ignore_index=True)

3.2.6 基于索引合并join

join函数如下:

代码语言:javascript
复制
DataFrame.join(self, other, on=None, how=“left”, lsuffix="", rsuffix="", sort=False)

其中

other:DataFrame, Series, or list of DataFrame,另外一个dataframe, series,或者dataframe list。 on: 参与join的列,与sql中的on参数类似。 how: {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘left’, 与sql中的join方式类似。 lsuffix: 左DataFrame中重复列的后缀 rsuffix: 右DataFrame中重复列的后缀 sort: 按字典序对结果在连接键上排序

join方式为按某个相同列进行join:

代码语言:javascript
复制
score_df = pd.DataFrame({'name': ['石申夫', '甘德', '乙', '甲'],
                           'age': [18, 28, 24, 36]})
score1_df = pd.DataFrame({'name': ['张衡', '石申夫', '乙', '甘德'],
                             'score': ['A', 'B', 'C', 'B']})

score_df.set_index('name', inplace=True) # 设置索引 可以尝试如果不设置会怎么样
score1_df.set_index('name', inplace=True) # 设置索引

score_df.join(score1_df, on='name')

输出为:

3.2.7 总结:

pandas包中,进行数据合并有join()、merge()、concat(), append()四种方法。它们的区别是:

df.join() 相同行索引的数据被合并在一起,因此拼接后的行数不会增加(可能会减少)、列数增加; df.merge()通过指定的列索引进行合并,行列都有可能增加;merge也可以指定行索引进行合并; pd.concat()通过axis参数指定在水平还是垂直方向拼接; df.append()在DataFrame的末尾添加一行或多行;大致等价于pd.concat(df1,df2,axis=0,join=‘outer’)。 join 最简单,主要用于基于索引的横向合并拼接 merge 最常用,主要用于基于指定列的横向合并拼接 concat最强大,可用于横向和纵向合并拼接 append,主要用于纵向追加

3.3 数据变换

数据变换的常见处理方式包括:

数据标准化处理 数据离散化处理 数据泛化处理

3.3.1分组与聚合

分组与聚合是常见的数据变换操作

分组指根据分组条件(一个或多个键)将原数据拆分为若干个组; 聚合指任何能从分组数据生成标量值的变换过程,这一过程中主要对各分组应用同一操作,并把操作后所得的结果整合到一起,生成一组新数据。

下面通过一个例子说明分组聚合的过程:

掌握分组与聚合的过程,可以熟练地groupby()、agg()、transfrom()和apply()方法实现分组与聚合操作

3.3.2 分组操作groupby()

pandas中使用groupby()方法根据键将原数据拆分为若干个分组。

代码语言:javascript
复制
groupby(by=None, axis=0, level=None, as_index=True, sort=True, 
        group_keys=True, squeeze=<object object>, observed=False, dropna=True)

by:表示分组的条件,可以取值为字符串、列表、字典或Series、函数等。 axis:表示分组操作的轴编号,可以是0或1。该参数的默认值为0,代表沿列方向操作。 level:表示标签索引所在的级别,默认为None。 as_index:表示聚合后新数据的索引是否为分组标签的索引,默认为True。 sort:表示是否对分组索引进行排序,默认为True。 group_keys:表示是否显示分组标签的名称,默认为True。

3.3.3 分组+内置聚合

分组+自定义聚合:

代码语言:javascript
复制
# 分组+自定义聚合
import pandas as pd
df_obj = pd.DataFrame({"key":["C", "B", "C", "A", "B", "B", "A", "C", "A"], 
                       "data":[2, 4, 6, 8, 10, 1, 3, 5, 7]})
print(df_obj)
df_obj[['key','data']].groupby(by="key").max()

输出为:

3.3.4 聚合操作 (6.2.3 )

pandas中可通过多种方式实现聚合操作,除前面介绍过的内置统计方法之外,还包括agg()、transfrom()和apply()方法。

初始化聚合所需的DF:

1.agg()聚合
代码语言:javascript
复制
# 初始化分组DF
import pandas as pd
df_obj = pd.DataFrame({'a': [0, 1, 2, 3, 4, 5],
                       'b': [1, 7, 13, 19, 25, 31],
                       'c': [1, 8, 14, 20, 26, 32],
                       'd': [2, 9, 15, 21, 27, 33],
                       'e': [2, 10, 16, 22, 28, 34],
                       'f': [2, 2, 2, 3, 3, 2]})
print(df_obj)

df_obj.groupby(by='f').agg({'a':'count'})

输出为:

2. transfrom()方法

transfrom()方法能对分组应用灵活的运算操作,同时可使聚合前与聚合后的数据结构保持一致。

代码语言:javascript
复制
# 初始化分组DF
import pandas as pd
df_obj = pd.DataFrame({'a': [0, 6, 12, 18, 24, 30],
                       'b': [1, 7, 13, 19, 25, 31],
                       'c': [1, 8, 14, 20, 26, 32],
                       'd': [2, 9, 15, 21, 27, 33],
                       'e': [2, 10, 16, 22, 28, 34],
                       'f': [2, 2, 2, 3, 3, 2]})
df_obj['a_max'] = df_obj[['a','f']].groupby(by=['f']).transform('max')

输出为:

3. apply()方法

apply()方法既能直接接收内置方法,又可以接收自定义的函数。

与前几种聚合方式相比,使用apply()方法聚合数据的操作更灵活,它可以代替前两种聚合完成基础操作,另外也可以解决一些特殊聚合操作。

代码语言:javascript
复制
apply(func, *args, **kwargs)

func:表示应用于各分组的函数或方法。 *args和**kwargs :表示传递给func的位置参数或关键字参数。

案例

代码语言:javascript
复制
# 初始化分组DF
import pandas as pd
df_obj = pd.DataFrame({'a': [0, 6, 12, 18, 24, 30],
                       'b': [1, 7, 13, 19, 25, 31],
                       'c': [1, 8, 14, 20, 26, 32],
                       'd': [2, 9, 15, 21, 27, 33],
                       'e': [2, 10, 16, 22, 28, 34],
                       'f': [2, 2, 2, 3, 3, 2]})
print(df_obj)
# 自定义函数,用于计算每个数据除以10的余数
def div_hun(df):
    return df.iloc[:, :] % 10
df_obj.groupby(by=['f']).apply(div_hun)

输出为:

3.3.5 哑变量处理

1.什么是哑变量

哑变量又称虚拟变量、名义变量等,它是人为虚设的变量,用来反映某个变量的不同类别,常用的取值为0和1。需要说明的是,0和1并不代表数量的多少,而代表不同的类别。

假设变量“职业”有司机、学生、导游、工人、教师共5个类别,这5个类别分别有0和1两种取值,0代表非此种类别,1代表此种类别。

实现哑变量的方法:

pandas中使用get_dummies()函数对类别数据进行哑变量处理,并在处理后返回一个哑变量矩阵。

代码语言:javascript
复制
get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False,
        columns=None, sparse=False, drop_first=False, dtype=None)

data:表示待处理的类别数据,可以是数组、DataFrame类或Series类对象。 prefix:表示列索引名称的前缀,默认为None。 prefix_sep:表示附加前缀的分隔符,默认为“_”。 columns:表示哑变量处理的列索引名称,默认为None。

案例

代码语言:javascript
复制
# 初始化DF
import pandas as pd
position_df = pd.DataFrame({'职业': ['工人', '学生', '司机', '教师', '导游']})
# 哑变量处理, 并给哑变量添加前缀
result = pd.get_dummies(position_df, prefix=['col'])  
result

输出为:

3.3.6 面元划分(6.2.5 )

掌握cut()函数的用法,可以熟练地使用过该函数实现面元划分操作

面元划分是指数据被离散化处理,按一定的映射关系划分为相应的面元(可以理解为区间),只适用于连续数据。连续数据又称连续变量,指在一定区间内可以任意取值的数据,该类型数据的特点是数值连续不断,相邻两个数值可作无限分割。

pandas中使用cut()函数能够实现面元划分操作,cut()函数会采用等宽法对连续型数据进行离散化处理。

代码语言:javascript
复制
cut(x, bins, right=True, labels=None, retbins=False, precision=3, 
      include_lowest=False, duplicates='raise', ordered=True)

x:表示面元划分的连续数据,可以取值为一维数组或Series类对象。 bins:表示划分面元的依据。 right:表示右端点是否为闭区间,默认为True。 precision:表示区间标签的精度,默认为3。 include_lowest:表示是否包含区间的左端点,默认为False。

cut()函数会返回一个Categorical类对象,该对象可以被看作一个包含若干个面元名称的数组,通过categories属性可以获取所有的分类,即每个数据对应的面元。

案例

代码语言:javascript
复制
import pandas as pd
ages = pd.Series([19, 21, 25, 55, 30, 45, 52, 46, 20])
bins = [0, 18, 30, 40, 50, 100]
# 使用cut函数划分年龄区间
cuts = pd.cut(ages, bins)
cuts

输出为:

代码语言:javascript
复制
import pandas as pd
ages = pd.Series([19, 21, 25, 55, 30, 45, 52, 46, 20])
bins = [0, 18, 30, 40, 50, 100]
# 使用cut函数划分年龄区间
cuts = pd.cut(ages, bins)
cuts

输出为:

3.4 数据规约

3.4.1 stack和unstack用法

pandas中可以使用stack()方法实现重塑分层索引操作。

代码语言:javascript
复制
stack(level=- 1, dropna=True)

level:表示索引的级别,默认为-1,即操作内层索引,若设为0,则会操作外层索引。 dropna:表示是否删除结果对象中存在缺失值的一行数据,默认为True。

同时还有一个stack的逆操作,unstack。两者的操作如下:

案例

初始化数据

代码语言:javascript
复制
import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[1,2,3],[4,5,6]]),
                    index=pd.Index(['A', 'B'], name='index_name'),
                    columns=pd.Index(['one', 'two', 'three'],
                    name='col_name'))
df             

输出为:

使用stack列转行

代码语言:javascript
复制
# 重塑df,使之具有两层行索引
# 原来的列数据one, two, three就到了行上来了,形成多层索引。
# 注意这里:stack()操作后返回的对象是Series类型
result = df.stack()
result

输出为:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据导入与预处理-课程总结-04~06章
  • 1. 第4章 pandas数据获取
    • 1.1 数据获取
      • 1.1.1 概述
      • 1.1.2 从CSV和TXT文件获取数据
      • 1.1.3 读取Excel文件
      • 1.1.4 读取json文件
      • 1.1.5 读取sql数据
  • 2. 第5章 数据清理
    • 2.1 数据清理概述
      • 2.1.1 数据清理概述
    • 2.2 数据清理案例
      • 2.1 缺失值处理
    • 2.3 重复值处理
      • 2.3.1 重复值的检测
      • 2.3.2 重复值的处理
      • 2.3.3 重复值处理案例
    • 2.4 异常值处理
      • 2.4.1 异常值的检测
  • 3. 第6章 数据集成变换规约
    • 3.1 数据集成
      • 3.1.1数据集成需要关注的问题
      • 3.2 基于Pandas实现数据集成
      • 3.2.3 主键合并数据merge
      • 3.2.4 堆叠合并数据concat
      • 3.2.5 追加合并数据append
      • 3.2.6 基于索引合并join
      • 3.2.7 总结:
    • 3.3 数据变换
      • 3.3.1分组与聚合
      • 3.3.2 分组操作groupby()
      • 3.3.3 分组+内置聚合
      • 3.3.4 聚合操作 (6.2.3 )
      • 3.3.5 哑变量处理
      • 3.3.6 面元划分(6.2.5 )
    • 3.4 数据规约
      • 3.4.1 stack和unstack用法
相关产品与服务
数据集成
数据集成(DataInLong)源于腾讯开源并孵化成功的 ASF 顶级项目 Apache InLong(应龙),依托 InLong 百万亿级别的数据接入和处理能力支持数据采集、汇聚、存储、分拣数据处理全流程,在跨云跨网环境下提供可靠、安全、敏捷的全场景异构数据源集成能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档