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

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

第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文件获取数据

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


案例


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

1.1.3 读取Excel文件

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

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


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类对象的列索引列表。


案例

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类对象。

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')

案例


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')

输出为:

e90c8f0a528242d9a69a1d57da5b8e53.png


1.1.5 读取sql数据

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


第5章 数据清理


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


2.1 数据清理概述

2.1.1 数据清理概述

数据清理概述


缺失值的检测与处理

重复值的检测与处理

异常值的检测与处理


2.2 数据清理案例

2.1 缺失值处理

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

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


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

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


2.1.2 删除缺失值

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


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()方法既可以使用指定的数据填充,也可以使用缺失值前面或后面的数据填充。


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() 会根据相应的插值方法求得的值进行填充。


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 案例

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()方法来检测数据中的重复值。


DataFrame.duplicated(subset=None, keep='first')


subset:表示识别重复项的列索引或列索引序列,默认标识所有的列索引。

keep:表示采用哪种方式保留重复项,该参数可以取值为’first’(默认值)、 'last '和 ‘False’,其中’first’代表删除重复项,仅保留第一次出现的数据项;'last '代表删除重复项,仅保留最后一次出现的数据项;'False’表示所有相同的数据都被标记为重复项。

duplicated()方法检测完数据后会返回一个由布尔值组成的Series类对象,该对象中若包含True,说明True对应的一行数据为重复项。


2.3.2 重复值的处理

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


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对象:


# 创建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.箱型图检测

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


92b2a4800d7941cdbe64af7e38893d04.png

Q3表示上四分位数,说明全部检测值中有四分之一的值比它大;

Q1表示下四分位数,说明全部检测值中有四分之一的值比它小;

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


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


第6章 数据集成变换规约


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

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

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


3.1 数据集成

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

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


实体识别

冗余属性识别

元组重复等


3.2 基于Pandas实现数据集成

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

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

6461465ba4934d9183e98d6d8b8fc633.png


3.2.3 主键合并数据merge

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

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

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


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实现纵向追加:


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函数如下:


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:


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')

输出为:


0bfd19958ce642aa9c932e152f4f3e5f.png

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分组与聚合

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


分组指根据分组条件(一个或多个键)将原数据拆分为若干个组;

聚合指任何能从分组数据生成标量值的变换过程,这一过程中主要对各分组应用同一操作,并把操作后所得的结果整合到一起,生成一组新数据。


6088258b4fc34392abda7be447a7e350.png

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


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


3.3.2 分组操作groupby()

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


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 分组+内置聚合

分组+自定义聚合:

# 分组+自定义聚合
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()

输出为:d87a2779ac444c4baa384f5ba575fc97.png



3.3.4 聚合操作 (6.2.3 )

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

初始化聚合所需的DF:


1.agg()聚合

# 初始化分组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'})

输出为:

41b5dea2b8e34d02b43c9bdf54859c41.png


2. transfrom()方法

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


# 初始化分组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')

输出为:

42b383a86f584a76800bb20ca9165b6c.png


3. apply()方法

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

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

apply(func, *args, **kwargs)

func:表示应用于各分组的函数或方法。

*args和**kwargs :表示传递给func的位置参数或关键字参数。


案例

# 初始化分组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)

输出为:

d4c70f4f8e84466f9eabd32d0ef1eb69.png


3.3.5 哑变量处理

1.什么是哑变量

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

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

实现哑变量的方法:

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

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。


案例

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

输出为:

92b7ed305fd74bee823a37a42498135e.png


3.3.6 面元划分(6.2.5 )

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

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


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


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属性可以获取所有的分类,即每个数据对应的面元。

983f0abc86394cd5944cf58d218e8975.png


案例

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

输出为:

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

输出为:e47cf6c3f4bf4a3c86b2ef5f0e034bd9.png


3.4 数据规约

3.4.1 stack和unstack用法

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

stack(level=- 1, dropna=True)


level:表示索引的级别,默认为-1,即操作内层索引,若设为0,则会操作外层索引。

dropna:表示是否删除结果对象中存在缺失值的一行数据,默认为True。


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

f55f197236954ce69af51c21e84a8785.png

案例

初始化数据

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             

输出为:

dd221dad8b27467084725ce06822c3cf.png

使用stack列转行

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

输出为:

62fb99f5da194b2d9c8dd50f3f5b56dd.png

相关文章
|
数据采集 存储 自然语言处理
数据导入与预处理-课程总结-01~03章(上)
数据导入与预处理-课程总结-01~03章 第1章 数据预处理概述 1.1 基本概念 1.1.1 大数据项目开发流程
数据导入与预处理-课程总结-01~03章(上)
|
数据采集 搜索推荐 大数据
数据导入与预处理-课程总结-01~03章(下)
数据导入与预处理-课程总结-01~03章 第1章 数据预处理概述 1.1 基本概念 1.1.1 大数据项目开发流程
数据导入与预处理-课程总结-01~03章(下)
|
数据采集 大数据 索引
数据导入与预处理-课程总结-01~03章(中)
数据导入与预处理-课程总结-01~03章 第1章 数据预处理概述 1.1 基本概念 1.1.1 大数据项目开发流程
数据导入与预处理-课程总结-01~03章(中)
|
数据挖掘 大数据 索引
数据导入与预处理-第6章-03数据规约
数据导入与预处理-第6章-03数据规约 3 数据规约 3.1 数据规约概述(6.3.1 )
数据导入与预处理-第6章-03数据规约
|
SQL 存储 自然语言处理
数据导入与预处理-第6章-01数据集成
数据导入与预处理-第6章-01数据集成 1 数据集成概述 1.1 数据集成需要关注的问题 2 基于Pandas实现数据集成
数据导入与预处理-第6章-01数据集成
|
数据处理 Python
数据导入与预处理-第6章-04pandas综合案例(下)
数据导入与预处理-第6章-04pandas综合案例 1 pandas综合案例-运动员信息数据 1.1 查看数据 1.2 数据处理与分析
数据导入与预处理-第6章-04pandas综合案例(下)
|
数据处理 Python
数据导入与预处理-第6章-04pandas综合案例(上)
数据导入与预处理-第6章-04pandas综合案例 1 pandas综合案例-运动员信息数据 1.1 查看数据 1.2 数据处理与分析
数据导入与预处理-第6章-04pandas综合案例(上)
|
编解码 人工智能 安全
数据理解与预处理-6|学习笔记
快速学习数据理解与预处理-6
数据理解与预处理-6|学习笔记
|
数据采集 数据挖掘 开发者
数据理解与预处理-3|学习笔记
快速学习数据理解与预处理-3
数据理解与预处理-3|学习笔记
|
机器学习/深度学习 算法 数据可视化
数据理解与预处理-4|学习笔记
快速学习数据理解与预处理-4
数据理解与预处理-4|学习笔记