IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 第6章 数据集成、变换与规约2 -> 正文阅读

[人工智能]第6章 数据集成、变换与规约2

目录

本博客所涉及的jupyter notebook及数据资料请在百度网盘下载

6.2.5 Pandas数据变换的其他基本操作

6.2.5.1 Pandas轴向旋转

数据的轴向旋装主要是重新指定一组数据的行索引或列索引,以达到重新组织数据结构的目的。
Pandas的DataFrame类实现轴向旋装方法有:

  • DataFrame.pivot()
  • DataFrame.melt()
6.2.5.1.1 pivot()方法
  • 函数作用:
    根据列值进行转置。使用指定索引/列中的唯一值形成返回数据框架的轴。该函数不支持数据聚合,多数值将导致多重索引。

  • 语法格式:

pandas.pivot(data, 
              index=None, 
              columns=None, 
              values=None)
  • 参数说明:

    • data 被转变的数据框架。
    • index 作为索引列,不指定时使用默认索引。
    • columns 作为返回数据框架的列
    • values 作为新构成数据框架的值
  • 使用实例:

import pandas as pd
df_obj =  pd.DataFrame({'商品名称': ['荣耀9X','小米6x','OPPO A1',
                                    '荣耀9X','小米6x','OPPO A1'],
                        '出售日期': ['5月25日', '5月25日','5月25日',
                                        '6月18日','6月18日', '6月18日'],
                          '价格(元)': [999, 1399, 1399, 800, 1200, 1250]})
df_obj
商品名称出售日期价格(元)
0荣耀9X5月25日999
1小米6x5月25日1399
2OPPO A15月25日1399
3荣耀9X6月18日800
4小米6x6月18日1200
5OPPO A16月18日1250
# 将出售日期一列的唯一数据变换为行索引,商品一列的唯一数据变换为列索引
new_df = df_obj.pivot(index='出售日期', columns='商品名称', 
values='价格(元)')
new_df
商品名称OPPO A1小米6x荣耀9X
出售日期
5月25日13991399999
6月18日12501200800
6.2.5.1.2 melt()方法
  • 函数作用:
    当一列或多列是标识符变量,而其它列被当成测定变量时,可以通过melt函数完成这种转变。

  • 语法格式:

pandas.melt(frame,
             id_vars=None,
             value_vars=None, 
             var_name=None, 
             value_name='value', 
             col_level=None, 
             ignore_index=True)
  • 参数说明:

    • id_vars 作为自变量的一列或多列。
    • value_vars 作为因变量的一列或多列,如果没有定义则将除id_vars列以外的所有列当作因变量列。
    • var_name 因变量列的名称,如果没有定义则使用几列中第一个列名。
    • value_name 转换后数值列的列名
    • col_level 当存在多重列索引时,指定用第几层索引进行转换
    • ignore_index True时忽略原始索引。否则保存原始索引。
  • 使用实例:

# 将列索引转换为一行数据
new_df.melt(value_name='价格(元)', ignore_index=False)
商品名称价格(元)
出售日期
5月25日OPPO A11399
6月18日OPPO A11250
5月25日小米6x1399
6月18日小米6x1200
5月25日荣耀9X999
6月18日荣耀9X800

练习例子:
原数据:
在这里插入图片描述

处理后数据:
在这里插入图片描述

1. 数据准备

# 数据准备
data={"date":['20150901','20150901','20150901'],"hour":[12,12,12],"type":['AQI','PM2.5_24h','PM10_24h'],"北京":[24,14,20],"天津":
     [25,22,25],"石家庄":[24,20,32],"唐山":[24,9,20]} 
import pandas as pd
df = pd.DataFrame(data)
df 
datehourtype北京天津石家庄唐山
02015090112AQI24252424
12015090112PM2.5_24h1422209
22015090112PM10_24h20253220

2. 数据处理

根据需求可以观察到需要将“北京”,“天津”,“石家庄”和“唐山”这四列变换为一行,同时保留type列的类容。

2.1 列变行

df_melt=df.melt(id_vars=['date','hour','type'],var_name='City')
df_melt
datehourtypeCityvalue
02015090112AQI北京24
12015090112PM2.5_24h北京14
22015090112PM10_24h北京20
32015090112AQI天津25
42015090112PM2.5_24h天津22
52015090112PM10_24h天津25
62015090112AQI石家庄24
72015090112PM2.5_24h石家庄20
82015090112PM10_24h石家庄32
92015090112AQI唐山24
102015090112PM2.5_24h唐山9
112015090112PM10_24h唐山20

2.2 行变列

df_melt_pivot = df_melt.pivot(index=['date','hour','City'],columns='type',values='value').reset_index()
df_melt_pivot
typedatehourCityAQIPM10_24hPM2.5_24h
02015090112北京242014
12015090112唐山24209
22015090112天津252522
32015090112石家庄243220

6.2.5.2 Pandas分组与聚合

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

实例处理过程如下:
在这里插入图片描述

6.2.5.2.1 分组操作

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

  • DataFrame.groupby()的语法规则:
DataFrame.groupby(by=None, 
                axis=0, 
                level=None, 
                as_index=True, 
                sort=True, 
                group_keys=True, 
                squeeze=<object>,            
                observed=False, 
                dropna=True)
  • DataFrame.groupby()的参数说明:

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

    • 1. 导入数据并查看总体信息:
import pandas as pd 
import numpy as np 


df_student = pd.read_excel("xscj2.xlsx",sheet_name="student")
df_course = pd.read_excel("xscj2.xlsx",sheet_name="course")
df_stuCourse = pd.read_excel("xscj2.xlsx",sheet_name=2)
df_student.head()
学号姓名专业性别出生年月总学分备注
081101刘华通信工程11991-03-0858NaN
181102程明计算机11991-02-0158NaN
281103王燕计算机01989-10-0658NaN
381104韦严平计算机11990-08-2658NaN
481106李方方计算机11990-11-2058NaN
df_student.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 23 entries, 0 to 22
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   学号      23 non-null     int64         
 1   姓名      23 non-null     object        
 2   专业      23 non-null     object        
 3   性别      23 non-null     int64         
 4   出生年月    23 non-null     datetime64[ns]
 5   总学分     23 non-null     int64         
 6   备注      7 non-null      object        
dtypes: datetime64[ns](1), int64(3), object(3)
memory usage: 1.4+ KB
df_course
课程号课程名开课学期学时学分
0101计算机基础1805
1102程序设计与语言2684
2206离散数学4684
3208数据结构5684
4209操作系统6684
5210计算机原理5855
6212数据库原理7684
7301计算机网络7513
8302软件工程7513
df_course.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   课程号     9 non-null      int64 
 1   课程名     9 non-null      object
 2   开课学期    9 non-null      int64 
 3   学时      9 non-null      int64 
 4   学分      9 non-null      int64 
dtypes: int64(4), object(1)
memory usage: 488.0+ bytes
df_stuCourse.head()
学号课程号成绩
08110110180
18110110278
28110120676
38110210278
48110220678
df_stuCourse.info() 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 41 entries, 0 to 40
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   学号      41 non-null     int64
 1   课程号     41 non-null     int64
 2   成绩      41 non-null     int64
dtypes: int64(3)
memory usage: 1.1 KB
# 表连接
df_stu_course_study = df_student.join(df_stuCourse.set_index("学号"),on="学号").join(df_course.set_index("课程号"),on="课程号").reset_index()
df_stu_course_study.head()
index学号姓名专业性别出生年月总学分备注课程号成绩课程名开课学期学时学分
0081101刘华通信工程11991-03-0858NaN101.080.0计算机基础1.080.05.0
1081101刘华通信工程11991-03-0858NaN102.078.0程序设计与语言2.068.04.0
2081101刘华通信工程11991-03-0858NaN206.076.0离散数学4.068.04.0
3181102程明计算机11991-02-0158NaN102.078.0程序设计与语言2.068.04.0
4181102程明计算机11991-02-0158NaN206.078.0离散数学4.068.04.0
df_data = df_stu_course_study[["学号","姓名","专业","性别","出生年月","课程号","课程名","成绩","总学分"]]
df_data.head()
学号姓名专业性别出生年月课程号课程名成绩总学分
081101刘华通信工程11991-03-08101.0计算机基础80.058
181101刘华通信工程11991-03-08102.0程序设计与语言78.058
281101刘华通信工程11991-03-08206.0离散数学76.058
381102程明计算机11991-02-01102.0程序设计与语言78.058
481102程明计算机11991-02-01206.0离散数学78.058
df_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 44 entries, 0 to 43
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   学号      44 non-null     int64         
 1   姓名      44 non-null     object        
 2   专业      44 non-null     object        
 3   性别      44 non-null     int64         
 4   出生年月    44 non-null     datetime64[ns]
 5   课程号     41 non-null     float64       
 6   课程名     41 non-null     object        
 7   成绩      41 non-null     float64       
dtypes: datetime64[ns](1), float64(2), int64(2), object(3)
memory usage: 2.9+ KB
  • DataFrame.groupby()使用示例:
    • 2. DataFrameGroupBy对象
      • A.查看内部情况
#现在根据学号进行groupby分组,得到的一个DataFrameGroupBy对象
stuNo_Grp = df_data.groupby(by="学号")
#stuNo_Grp = df_data.groupby("学号")  #by可以省略
stuNo_Grp
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000025FE1A18F08>
# 查看groupby类型
type(stuNo_Grp)
pandas.core.groupby.generic.DataFrameGroupBy



这个DataFrameGroupBy对象到底长的什么样子?我们用list展开看看:
# 查看对象内部的情况
list(stuNo_Grp)
[(81101,
        学号  姓名    专业  性别       出生年月    课程号      课程名    成绩  总学分
  0  81101  刘华  通信工程   1 1991-03-08  101.0    计算机基础  80.0   58
  1  81101  刘华  通信工程   1 1991-03-08  102.0  程序设计与语言  78.0   58
  2  81101  刘华  通信工程   1 1991-03-08  206.0     离散数学  76.0   58),
 (81102,
        学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  3  81102  程明  计算机   1 1991-02-01  102.0  程序设计与语言  78.0   58
  4  81102  程明  计算机   1 1991-02-01  206.0     离散数学  78.0   58),
 (81103,
        学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  5  81103  王燕  计算机   0 1989-10-06  101.0    计算机基础  52.0   58
  6  81103  王燕  计算机   0 1989-10-06  102.0  程序设计与语言  70.0   58
  7  81103  王燕  计算机   0 1989-10-06  206.0     离散数学  81.0   58),
 (81104,
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  8   81104  韦严平  计算机   1 1990-08-26  101.0    计算机基础  90.0   58
  9   81104  韦严平  计算机   1 1990-08-26  102.0  程序设计与语言  84.0   58
  10  81104  韦严平  计算机   1 1990-08-26  206.0     离散数学  65.0   58),
 (81106,
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  11  81106  李方方  计算机   1 1990-11-20  101.0    计算机基础  59.0   58
  12  81106  李方方  计算机   1 1990-11-20  102.0  程序设计与语言  71.0   58
  13  81106  李方方  计算机   1 1990-11-20  206.0     离散数学  81.0   58),
 (81107,
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  14  81107  李明  计算机   1 1990-05-01  101.0    计算机基础  78.0   62
  15  81107  李明  计算机   1 1990-05-01  102.0  程序设计与语言  80.0   62
  16  81107  李明  计算机   1 1990-05-01  206.0     离散数学  68.0   62),
 (81108,
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  17  81108  林一帆  计算机   1 1989-08-05  101.0    计算机基础  85.0   60
  18  81108  林一帆  计算机   1 1989-08-05  102.0  程序设计与语言  55.0   60
  19  81108  林一帆  计算机   1 1989-08-05  206.0     离散数学  87.0   60),
 (81109,
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  20  81109  张强民  计算机   1 1989-08-11  101.0    计算机基础  66.0   58
  21  81109  张强民  计算机   1 1989-08-11  102.0  程序设计与语言  83.0   58
  22  81109  张强民  计算机   1 1989-08-11  206.0     离散数学  70.0   58),
 (81110,
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  23  81110  张蔚  计算机   0 1991-07-22  101.0    计算机基础  95.0   58
  24  81110  张蔚  计算机   0 1991-07-22  102.0  程序设计与语言  90.0   58
  25  81110  张蔚  计算机   0 1991-07-22  206.0     离散数学  89.0   58),
 (81111,
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  26  81111  赵琳  计算机   0 1990-03-18  101.0    计算机基础  91.0   58
  27  81111  赵琳  计算机   0 1990-03-18  102.0  程序设计与语言  70.0   58
  28  81111  赵琳  计算机   0 1990-03-18  206.0     离散数学  76.0   58),
 (81113,
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  29  81113  严红  计算机   0 1989-08-11  101.0    计算机基础  63.0   56
  30  81113  严红  计算机   0 1989-08-11  102.0  程序设计与语言  79.0   56
  31  81113  严红  计算机   0 1989-08-11  206.0     离散数学  60.0   56),
 (81201,
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  32  81201  王敏  通信工程   1 1989-06-10  101.0  计算机基础  80.0   42),
 (81202,
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  33  81202  王林  通信工程   1 1989-01-29  101.0  计算机基础  58.0   40),
 (81203,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  34  81203  王玉民  通信工程   1 1990-03-26  101.0  计算机基础  87.0   52),
 (81204,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  35  81204  马琳琳  通信工程   0 1989-02-10  101.0  计算机基础  91.0   52),
 (81206,
         学号  姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
  36  81206  李计  通信工程   1 1989-09-20  NaN  NaN NaN   52),
 (81210,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  37  81210  李红庆  通信工程   1 1989-05-01  101.0  计算机基础  76.0   54),
 (81216,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  38  81216  孙祥欣  通信工程   1 1989-03-09  101.0  计算机基础  81.0   52),
 (81218,
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  39  81218  孙研  通信工程   1 1990-10-09  101.0  计算机基础  70.0   52),
 (81220,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  40  81220  吴薇华  通信工程   0 1990-03-18  101.0  计算机基础  82.0   52),
 (81221,
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  41  81221  刘燕敏  通信工程   0 1989-11-12  101.0  计算机基础  76.0   52),
 (81251,
         学号   姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
  42  81251  罗林琳  通信工程   0 1990-01-30  NaN  NaN NaN   60),
 (81255,
         学号  姓名   专业  性别       出生年月  课程号  课程名  成绩  总学分
  43  81255  李牧  计算机   1 1990-10-14  NaN  NaN NaN   58)]

终于看到了这个对象的神秘面目:

  • 对象是一个大列表,里面包含43个元素,每个元素有个元组对象
  • 元素就是按照我们指定的学号进行分组:分别是各个同学的全部数据信息
list(stuNo_Grp)[0]
(81101,
       学号  姓名    专业  性别       出生年月    课程号      课程名    成绩  总学分
 0  81101  刘华  通信工程   1 1991-03-08  101.0    计算机基础  80.0   58
 1  81101  刘华  通信工程   1 1991-03-08  102.0  程序设计与语言  78.0   58
 2  81101  刘华  通信工程   1 1991-03-08  206.0     离散数学  76.0   58)
list(stuNo_Grp)[1]
(81102,
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
 3  81102  程明  计算机   1 1991-02-01  102.0  程序设计与语言  78.0   58
 4  81102  程明  计算机   1 1991-02-01  206.0     离散数学  78.0   58)
list(stuNo_Grp)[0][0]
81101
list(stuNo_Grp)[0][1]
学号姓名专业性别出生年月课程号课程名成绩总学分
081101刘华通信工程11991-03-08101.0计算机基础80.058
181101刘华通信工程11991-03-08102.0程序设计与语言78.058
281101刘华通信工程11991-03-08206.0离散数学76.058

总结:
当我们根据某个字段进行group机制分组的时候,最后能够生成多少个子DataFrame,取决于我们的字段中有多少个不同的元素(案例有43个);
当我们分组之后,便可以进行后续的各种聚合操作,比如sum、mean、min等。

  • DataFrame.groupby()使用示例:
    • 2. DataFrameGroupBy对象
      • B.遍历DataFrameGroupBy对象
for stuNo,stuInfo in stuNo_Grp:
    print("学号:",stuNo)
    print(stuInfo)
学号: 81101
      学号  姓名    专业  性别       出生年月    课程号      课程名    成绩  总学分
0  81101  刘华  通信工程   1 1991-03-08  101.0    计算机基础  80.0   58
1  81101  刘华  通信工程   1 1991-03-08  102.0  程序设计与语言  78.0   58
2  81101  刘华  通信工程   1 1991-03-08  206.0     离散数学  76.0   58
学号: 81102
      学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
3  81102  程明  计算机   1 1991-02-01  102.0  程序设计与语言  78.0   58
4  81102  程明  计算机   1 1991-02-01  206.0     离散数学  78.0   58
学号: 81103
      学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
5  81103  王燕  计算机   0 1989-10-06  101.0    计算机基础  52.0   58
6  81103  王燕  计算机   0 1989-10-06  102.0  程序设计与语言  70.0   58
7  81103  王燕  计算机   0 1989-10-06  206.0     离散数学  81.0   58
学号: 81104
       学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
8   81104  韦严平  计算机   1 1990-08-26  101.0    计算机基础  90.0   58
9   81104  韦严平  计算机   1 1990-08-26  102.0  程序设计与语言  84.0   58
10  81104  韦严平  计算机   1 1990-08-26  206.0     离散数学  65.0   58
学号: 81106
       学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
11  81106  李方方  计算机   1 1990-11-20  101.0    计算机基础  59.0   58
12  81106  李方方  计算机   1 1990-11-20  102.0  程序设计与语言  71.0   58
13  81106  李方方  计算机   1 1990-11-20  206.0     离散数学  81.0   58
学号: 81107
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
14  81107  李明  计算机   1 1990-05-01  101.0    计算机基础  78.0   62
15  81107  李明  计算机   1 1990-05-01  102.0  程序设计与语言  80.0   62
16  81107  李明  计算机   1 1990-05-01  206.0     离散数学  68.0   62
学号: 81108
       学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
17  81108  林一帆  计算机   1 1989-08-05  101.0    计算机基础  85.0   60
18  81108  林一帆  计算机   1 1989-08-05  102.0  程序设计与语言  55.0   60
19  81108  林一帆  计算机   1 1989-08-05  206.0     离散数学  87.0   60
学号: 81109
       学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
20  81109  张强民  计算机   1 1989-08-11  101.0    计算机基础  66.0   58
21  81109  张强民  计算机   1 1989-08-11  102.0  程序设计与语言  83.0   58
22  81109  张强民  计算机   1 1989-08-11  206.0     离散数学  70.0   58
学号: 81110
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
23  81110  张蔚  计算机   0 1991-07-22  101.0    计算机基础  95.0   58
24  81110  张蔚  计算机   0 1991-07-22  102.0  程序设计与语言  90.0   58
25  81110  张蔚  计算机   0 1991-07-22  206.0     离散数学  89.0   58
学号: 81111
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
26  81111  赵琳  计算机   0 1990-03-18  101.0    计算机基础  91.0   58
27  81111  赵琳  计算机   0 1990-03-18  102.0  程序设计与语言  70.0   58
28  81111  赵琳  计算机   0 1990-03-18  206.0     离散数学  76.0   58
学号: 81113
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
29  81113  严红  计算机   0 1989-08-11  101.0    计算机基础  63.0   56
30  81113  严红  计算机   0 1989-08-11  102.0  程序设计与语言  79.0   56
31  81113  严红  计算机   0 1989-08-11  206.0     离散数学  60.0   56
学号: 81201
       学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
32  81201  王敏  通信工程   1 1989-06-10  101.0  计算机基础  80.0   42
学号: 81202
       学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
33  81202  王林  通信工程   1 1989-01-29  101.0  计算机基础  58.0   40
学号: 81203
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
34  81203  王玉民  通信工程   1 1990-03-26  101.0  计算机基础  87.0   52
学号: 81204
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
35  81204  马琳琳  通信工程   0 1989-02-10  101.0  计算机基础  91.0   52
学号: 81206
       学号  姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
36  81206  李计  通信工程   1 1989-09-20  NaN  NaN NaN   52
学号: 81210
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
37  81210  李红庆  通信工程   1 1989-05-01  101.0  计算机基础  76.0   54
学号: 81216
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
38  81216  孙祥欣  通信工程   1 1989-03-09  101.0  计算机基础  81.0   52
学号: 81218
       学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
39  81218  孙研  通信工程   1 1990-10-09  101.0  计算机基础  70.0   52
学号: 81220
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
40  81220  吴薇华  通信工程   0 1990-03-18  101.0  计算机基础  82.0   52
学号: 81221
       学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
41  81221  刘燕敏  通信工程   0 1989-11-12  101.0  计算机基础  76.0   52
学号: 81251
       学号   姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
42  81251  罗林琳  通信工程   0 1990-01-30  NaN  NaN NaN   60
学号: 81255
       学号  姓名   专业  性别       出生年月  课程号  课程名  成绩  总学分
43  81255  李牧  计算机   1 1990-10-14  NaN  NaN NaN   58
  • DataFrame.groupby()使用示例:
    • 2. DataFrameGroupBy对象
      • C.选择分组get_group()
        DataFrameGroupBy对象使用get_group()方法,能够让我们得到分组元素中的指定组的数据:
stuNo_Grp.get_group(81101)
学号姓名专业性别出生年月课程号课程名成绩总学分
081101刘华通信工程11991-03-08101.0计算机基础80.058
181101刘华通信工程11991-03-08102.0程序设计与语言78.058
281101刘华通信工程11991-03-08206.0离散数学76.058
  • DataFrame.groupby()使用示例:
    • 2. DataFrameGroupBy对象
      • D.同一个列名使用不同聚合函数
        分组之后对同一个列名使用不同的函数,函数使用列表形式:下面表示的是对成绩分别求和、最大值、最小值、均值、个数(size)
df_Scores = df_data.groupby("学号")["成绩"].agg(["sum","max","min","mean","size"])
df_Scores
summaxminmeansize
学号
81101234.080.076.078.0000003
81102156.078.078.078.0000002
81103203.081.052.067.6666673
81104239.090.065.079.6666673
81106211.081.059.070.3333333
81107226.080.068.075.3333333
81108227.087.055.075.6666673
81109219.083.066.073.0000003
81110274.095.089.091.3333333
81111237.091.070.079.0000003
81113202.079.060.067.3333333
8120180.080.080.080.0000001
8120258.058.058.058.0000001
8120387.087.087.087.0000001
8120491.091.091.091.0000001
812060.0NaNNaNNaN1
8121076.076.076.076.0000001
8121681.081.081.081.0000001
8121870.070.070.070.0000001
8122082.082.082.082.0000001
8122176.076.076.076.0000001
812510.0NaNNaNNaN1
812550.0NaNNaNNaN1
  • DataFrame.groupby()使用示例:
    • 3. 按多列进行分组
df_data.head()
学号姓名专业性别出生年月课程号课程名成绩总学分
081101刘华通信工程11991-03-08101.0计算机基础80.058
181101刘华通信工程11991-03-08102.0程序设计与语言78.058
281101刘华通信工程11991-03-08206.0离散数学76.058
381102程明计算机11991-02-01102.0程序设计与语言78.058
481102程明计算机11991-02-01206.0离散数学78.058

将数据按专业学号进行分组

df_special_stuNo = df_data.groupby(["专业","学号"])
list(df_special_stuNo)
[(('计算机', 81102),
        学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  3  81102  程明  计算机   1 1991-02-01  102.0  程序设计与语言  78.0   58
  4  81102  程明  计算机   1 1991-02-01  206.0     离散数学  78.0   58),
 (('计算机', 81103),
        学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  5  81103  王燕  计算机   0 1989-10-06  101.0    计算机基础  52.0   58
  6  81103  王燕  计算机   0 1989-10-06  102.0  程序设计与语言  70.0   58
  7  81103  王燕  计算机   0 1989-10-06  206.0     离散数学  81.0   58),
 (('计算机', 81104),
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  8   81104  韦严平  计算机   1 1990-08-26  101.0    计算机基础  90.0   58
  9   81104  韦严平  计算机   1 1990-08-26  102.0  程序设计与语言  84.0   58
  10  81104  韦严平  计算机   1 1990-08-26  206.0     离散数学  65.0   58),
 (('计算机', 81106),
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  11  81106  李方方  计算机   1 1990-11-20  101.0    计算机基础  59.0   58
  12  81106  李方方  计算机   1 1990-11-20  102.0  程序设计与语言  71.0   58
  13  81106  李方方  计算机   1 1990-11-20  206.0     离散数学  81.0   58),
 (('计算机', 81107),
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  14  81107  李明  计算机   1 1990-05-01  101.0    计算机基础  78.0   62
  15  81107  李明  计算机   1 1990-05-01  102.0  程序设计与语言  80.0   62
  16  81107  李明  计算机   1 1990-05-01  206.0     离散数学  68.0   62),
 (('计算机', 81108),
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  17  81108  林一帆  计算机   1 1989-08-05  101.0    计算机基础  85.0   60
  18  81108  林一帆  计算机   1 1989-08-05  102.0  程序设计与语言  55.0   60
  19  81108  林一帆  计算机   1 1989-08-05  206.0     离散数学  87.0   60),
 (('计算机', 81109),
         学号   姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  20  81109  张强民  计算机   1 1989-08-11  101.0    计算机基础  66.0   58
  21  81109  张强民  计算机   1 1989-08-11  102.0  程序设计与语言  83.0   58
  22  81109  张强民  计算机   1 1989-08-11  206.0     离散数学  70.0   58),
 (('计算机', 81110),
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  23  81110  张蔚  计算机   0 1991-07-22  101.0    计算机基础  95.0   58
  24  81110  张蔚  计算机   0 1991-07-22  102.0  程序设计与语言  90.0   58
  25  81110  张蔚  计算机   0 1991-07-22  206.0     离散数学  89.0   58),
 (('计算机', 81111),
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  26  81111  赵琳  计算机   0 1990-03-18  101.0    计算机基础  91.0   58
  27  81111  赵琳  计算机   0 1990-03-18  102.0  程序设计与语言  70.0   58
  28  81111  赵琳  计算机   0 1990-03-18  206.0     离散数学  76.0   58),
 (('计算机', 81113),
         学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
  29  81113  严红  计算机   0 1989-08-11  101.0    计算机基础  63.0   56
  30  81113  严红  计算机   0 1989-08-11  102.0  程序设计与语言  79.0   56
  31  81113  严红  计算机   0 1989-08-11  206.0     离散数学  60.0   56),
 (('计算机', 81255),
         学号  姓名   专业  性别       出生年月  课程号  课程名  成绩  总学分
  43  81255  李牧  计算机   1 1990-10-14  NaN  NaN NaN   58),
 (('通信工程', 81101),
        学号  姓名    专业  性别       出生年月    课程号      课程名    成绩  总学分
  0  81101  刘华  通信工程   1 1991-03-08  101.0    计算机基础  80.0   58
  1  81101  刘华  通信工程   1 1991-03-08  102.0  程序设计与语言  78.0   58
  2  81101  刘华  通信工程   1 1991-03-08  206.0     离散数学  76.0   58),
 (('通信工程', 81201),
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  32  81201  王敏  通信工程   1 1989-06-10  101.0  计算机基础  80.0   42),
 (('通信工程', 81202),
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  33  81202  王林  通信工程   1 1989-01-29  101.0  计算机基础  58.0   40),
 (('通信工程', 81203),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  34  81203  王玉民  通信工程   1 1990-03-26  101.0  计算机基础  87.0   52),
 (('通信工程', 81204),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  35  81204  马琳琳  通信工程   0 1989-02-10  101.0  计算机基础  91.0   52),
 (('通信工程', 81206),
         学号  姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
  36  81206  李计  通信工程   1 1989-09-20  NaN  NaN NaN   52),
 (('通信工程', 81210),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  37  81210  李红庆  通信工程   1 1989-05-01  101.0  计算机基础  76.0   54),
 (('通信工程', 81216),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  38  81216  孙祥欣  通信工程   1 1989-03-09  101.0  计算机基础  81.0   52),
 (('通信工程', 81218),
         学号  姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  39  81218  孙研  通信工程   1 1990-10-09  101.0  计算机基础  70.0   52),
 (('通信工程', 81220),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  40  81220  吴薇华  通信工程   0 1990-03-18  101.0  计算机基础  82.0   52),
 (('通信工程', 81221),
         学号   姓名    专业  性别       出生年月    课程号    课程名    成绩  总学分
  41  81221  刘燕敏  通信工程   0 1989-11-12  101.0  计算机基础  76.0   52),
 (('通信工程', 81251),
         学号   姓名    专业  性别       出生年月  课程号  课程名  成绩  总学分
  42  81251  罗林琳  通信工程   0 1990-01-30  NaN  NaN NaN   60)]
list(df_special_stuNo)[0]
(('计算机', 81102),
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
 3  81102  程明  计算机   1 1991-02-01  102.0  程序设计与语言  78.0   58
 4  81102  程明  计算机   1 1991-02-01  206.0     离散数学  78.0   58)
list(df_special_stuNo)[0][0]
('计算机', 81102)
list(df_special_stuNo)[0][1]
学号姓名专业性别出生年月课程号课程名成绩总学分
381102程明计算机11991-02-01102.0程序设计与语言78.058
481102程明计算机11991-02-01206.0离散数学78.058
list(df_special_stuNo)[0][0][0]
'计算机'
list(df_special_stuNo)[0][0][1]
81102
list(df_special_stuNo)[1]
(('计算机', 81103),
       学号  姓名   专业  性别       出生年月    课程号      课程名    成绩  总学分
 5  81103  王燕  计算机   0 1989-10-06  101.0    计算机基础  52.0   58
 6  81103  王燕  计算机   0 1989-10-06  102.0  程序设计与语言  70.0   58
 7  81103  王燕  计算机   0 1989-10-06  206.0     离散数学  81.0   58)
df1 = df_special_stuNo.size()
print(df1)

专业    学号   
计算机   81102    2
      81103    3
      81104    3
      81106    3
      81107    3
      81108    3
      81109    3
      81110    3
      81111    3
      81113    3
      81255    1
通信工程  81101    3
      81201    1
      81202    1
      81203    1
      81204    1
      81206    1
      81210    1
      81216    1
      81218    1
      81220    1
      81221    1
      81251    1
dtype: int64
6.2.5.2.2 聚合操作

在《数据库基础及应用》这门课程中,我们知道,聚合操作如下实现:

select
     学号
     ,sum(成绩) -- 成绩总分
     ,max(成绩) -- 该生单科最高分
     ,min(成绩) -- 该生单科最低分
     ,avg(成绩) -- 该生平均值
from score
group by 学号  -- 根据学生学号分组统计   

在上面的SQL语句中,sum…avg就是常见的聚合操作,归类整理下pandas常用的聚合操作:

函数含义
min/max最小值、最大值
sum求和
mean均值
median中位数
std标准差
var方差
count计数统计

除了上面的聚合函数,我们还可以使用numpy库的方法,比如unique(不同的元素)、nunique(不同元素的个数,count是统计全部)等,下面会结合实际的例子来说明。

  • 聚合操作示例:

    • 1.agg聚合操作
      在这里插入图片描述
  • 聚合操作示例:

    • 1.agg聚合操作
      • A.对单个列进行聚合操作
# 求各个同学的总分
# stuNo_SumScore= df_data.groupby("学号")["成绩"].agg("sum")
# 与下面写法等价
stuNo_SumScore = df_data.groupby("学号").agg({"成绩":"sum"})
stuNo_SumScore
成绩
学号
81101234.0
81102156.0
81103203.0
81104239.0
81106211.0
81107226.0
81108227.0
81109219.0
81110274.0
81111237.0
81113202.0
8120180.0
8120258.0
8120387.0
8120491.0
812060.0
8121076.0
8121681.0
8121870.0
8122082.0
8122176.0
812510.0
812550.0

一般情况下,结果是一个以分组字段为行索引的数据帧,那如果我们也想把这个行索引变成数据帧中的一个列名属性,使用reset_index完成:

stuNo_SumScore.reindex()
学号
81101    234.0
81102    156.0
81103    203.0
81104    239.0
81106    211.0
81107    226.0
81108    227.0
81109    219.0
81110    274.0
81111    237.0
81113    202.0
81201     80.0
81202     58.0
81203     87.0
81204     91.0
81206      0.0
81210     76.0
81216     81.0
81218     70.0
81220     82.0
81221     76.0
81251      0.0
81255      0.0
Name: 成绩, dtype: float64
stuNo_SumScore
学号
81101    234.0
81102    156.0
81103    203.0
81104    239.0
81106    211.0
81107    226.0
81108    227.0
81109    219.0
81110    274.0
81111    237.0
81113    202.0
81201     80.0
81202     58.0
81203     87.0
81204     91.0
81206      0.0
81210     76.0
81216     81.0
81218     70.0
81220     82.0
81221     76.0
81251      0.0
81255      0.0
Name: 成绩, dtype: float64
  • 聚合操作示例:
    • 1.agg聚合操作
      • B.对多个列使用不同的聚合函
        学号分组,对成绩列求和,对课程名列统计个数
df_data.head(2)
学号姓名专业性别出生年月课程号课程名成绩总学分
081101刘华通信工程11991-03-08101.0计算机基础80.058
181101刘华通信工程11991-03-08102.0程序设计与语言78.058
stu_SumScore_CountCourse = df_data.groupby("学号").agg({"成绩":"sum","课程名":"count"})
stu_SumScore_CountCourse
成绩课程名
学号
81101234.03
81102156.02
81103203.03
81104239.03
81106211.03
81107226.03
81108227.03
81109219.03
81110274.03
81111237.03
81113202.03
8120180.01
8120258.01
8120387.01
8120491.01
812060.00
8121076.01
8121681.01
8121870.01
8122082.01
8122176.01
812510.00
812550.00

给生成的新列重新起给名字

stu_SumScore_CountCourse.columns = ["总分","科目数"]
stu_SumScore_CountCourse
总分科目数
学号
81101234.03
81102156.02
81103203.03
81104239.03
81106211.03
81107226.03
81108227.03
81109219.03
81110274.03
81111237.03
81113202.03
8120180.01
8120258.01
8120387.01
8120491.01
812060.00
8121076.01
8121681.01
8121870.01
8122082.01
8122176.01
812510.00
812550.00
stu_SumScore_CountCourse = df_data.groupby("学号").agg({"成绩":"sum","课程名":"count"}).rename(columns={"成绩":"总成绩","课程名":"选修课程数"})
stu_SumScore_CountCourse
总成绩选修课程数
学号
81101234.03
81102156.02
81103203.03
81104239.03
81106211.03
81107226.03
81108227.03
81109219.03
81110274.03
81111237.03
81113202.03
8120180.01
8120258.01
8120387.01
8120491.01
812060.00
8121076.01
8121681.01
8121870.01
8122082.01
8122176.01
812510.00
812550.00
  • 聚合操作示例:
    • 2.GroupBy类对象可以直接使用Python内置的统计方法来聚合各分组的数据。
stuNo_Grp["成绩"].sum()
学号
81101    234.0
81102    156.0
81103    203.0
81104    239.0
81106    211.0
81107    226.0
81108    227.0
81109    219.0
81110    274.0
81111    237.0
81113    202.0
81201     80.0
81202     58.0
81203     87.0
81204     91.0
81206      0.0
81210     76.0
81216     81.0
81218     70.0
81220     82.0
81221     76.0
81251      0.0
81255      0.0
Name: 成绩, dtype: float64

6.2.5.3 Pandas哑变量处理

在数据分析或挖掘中,一些算法模型要求输入以数值类型表示的特征,但代表特征的数据不一定都是数值类型的,其中一部分是类别型的,例如,受教育程度表示方式有大学、研究生、博士等类别,这些类别均为非数值类型的数据。为了将类别类型的数据转换为数值类型的数据,类别类型的数据在被应用之前需要经过“量化”处理,从而转换为哑变量

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

举例如下图:
在这里插入图片描述

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

  • get_dummies()语法格式:
get_dummies(data,
            prefix=None, 
            prefix_sep='_', 
            dummy_na=False,
            columns=None, 
            sparse=False, 
            drop_first=False, 
            dtype=None)
  • get_dummies()参数说明:

    • data:表示待处理的类别数据,可以是数组、DataFrame类或Series类对象。
    • prefix:表示列索引名称的前缀,默认为None。
    • prefix_sep:表示附加前缀的分隔符,默认为“_”。
    • dummy_na:表示是否为NaN添加以列,默认为False。
    • columns:表示哑变量处理的列索引名称,默认为None。
    • sparse: 表示哑变量是否系数,默认为False。
    • drop_first:表示是否从K个分类级别总删除第一个级别,以获得K-1个分类级别,默认为False。
  • get_dummies()使用示例:

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

6.2.5.4 Pandas面元划分

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

前面我们已经学过,对离散量进行区间划分的函数pandas.cut().

import pandas as pd
ages = pd.Series([19, 21, 25, 55, 30, 45, 52, 46, 20])
ages
0    19
1    21
2    25
3    55
4    30
5    45
6    52
7    46
8    20
dtype: int64
bins = [0, 18, 30, 40, 50, 100]
# 使用cut函数划分年龄区间
cuts = pd.cut(ages, bins)
print(cuts)
0     (18, 30]
1     (18, 30]
2     (18, 30]
3    (50, 100]
4     (18, 30]
5     (40, 50]
6    (50, 100]
7     (40, 50]
8     (18, 30]
dtype: category
Categories (5, interval[int64, right]): [(0, 18] < (18, 30] < (30, 40] < (40, 50] < (50, 100]]

6.3 数据规约

6.3.1 数据规约概述

对于中型或小型的数据集而言,通过前面学习的预处理方式已经足以应对,但这些方式并不适合大型数据集。由于大型数据集一般存在数量庞大、属性多且冗余、结构复杂等特点,直接被应用可能会耗费大量的分析或挖掘时间,此时便需要用到数据规约

数据规约类似数据集的压缩,它的作用主要是从原有数据集中获得一个精简的数据集,这样可以在降低数据规模的基础上,保留了原有数据集的完整特性。在使用精简的数据集进行分析或挖掘时,不仅可以提高工作效率,还可以保证分析或挖掘的结果与使用原有数据集获得的结果基本相同。

要完成数据规约这一过程,可采用多种手段,包括维度规约、数量规约和数据压缩

  • 维度规约
    维度规约是指减少所需属性的数目。数据集中可能包含成千上万个属性,绝大部分属性与分析或挖掘目标无关,这些无关的属性可直接被删除,以缩小数据集的规模,这一操作就是维度规约。
    维度规约的主要手段是属性子集选择,属性子集选择通过删除不相关或冗余的属性,从原有数据集中选出一个有代表性的样本子集,使样本子集的分布尽可能地接近所有数据集的分布。

  • 数量规约
    数量规约是指用较小规模的数据替换或估计原数据,主要包括回归与线性对数模型、直方图、聚类、采样和数据立方体这几种方法,其中直方图是一种流行的数据规约方法。
    在这里插入图片描述

    • 直方图
      直方图是一种流行的数据规约方法,它会将给定属性的数据分布划分为不相交的子集或桶(给定属性的一个连续区间)
      在这里插入图片描述

    • 采样
      采样也是一种常用的数据规约手段,它通过选取随机样本以实现用小数据代表大数据,主要包括简单随机采样、聚类采样、分层采样等几种方法。
      在这里插入图片描述

  • 数据压缩
    数据压缩是利用编码或转换将原有数据集压缩为一个较小规模的数据集
    在这里插入图片描述

  • Pandas总数据规约操作:

    • 重塑分层索引
    • 降采样

6.3.2 重塑分层索引

重塑分层索引是pandas中简单的维度规约操作,该操作主要会将DataFrame类对象的列索引转换为行索引,生成一个具有分层索引的结果对象
如下图所示:
在这里插入图片描述

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

  • pandas.stack()语法格式:
 pandas.stack(level=- 1, dropna=True)
  • pandas.stack()参数说明:

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

import pandas as pd
df = pd.DataFrame({'A':['A0','A1','A2'],
                       'B':['B0','B1','B2']})
df 
AB
0A0B0
1A1B1
2A2B2
df.index
RangeIndex(start=0, stop=3, step=1)
# 重塑df,使之具有两层行索引
result = df.stack()
result
0  A    A0
   B    B0
1  A    A1
   B    B1
2  A    A2
   B    B2
dtype: object
result.index
MultiIndex([(0, 'A'),
            (0, 'B'),
            (1, 'A'),
            (1, 'B'),
            (2, 'A'),
            (2, 'B')],
           )

6.3.3 降采样

降采样是一种简单的数据规约操作,它主要是将高频率采集数据规约到低频率采集数据,比如,从每日采集一次数据降低到每月采集一次数据,会增大采样的时间粒度,且在一定程度上减少了数据量。

降采样常见于时间序列类型的数据。假设现有一组按日统计的包含开盘价、收盘价等信息的股票数据(非真实数据),该组数据的采集频率由每天采集一次变为每7天采集一次。

如下图所示;
在这里插入图片描述

  • resample()的语法格式:
 resample(rule, 
        axis=0, 
        closed=None, 
        label=None, 
        convention='start', 
        kind=None, 
        loffset=None, 
        base=None, 
        on=None, 
        level=None, 
        origin='start_day', 
        offset=None)
  • resample()的参数说明:

    • rule:表示降采样的频率。
    • axis:表示沿哪个轴完成降采样操作,可以取值为0/'index’或1/‘columns’,默认值为0。
    • closed:表示各时间段的哪一端是闭合的,可取值为’right’、'left’或None。
    • label:表示降采样时设置的聚合结果的标签。
    • limit:表示允许前向或后向填充的最大时期数。
  • resample()的使用示例:

import numpy as np
import pandas as pd
time_ser = pd.date_range('2020/06/01', periods=30)
stock_data = np.random.randint(40, 60, size=30)
time_obj = pd.Series(stock_data, index=time_ser)
print(time_obj)
2020-06-01    52
2020-06-02    58
2020-06-03    48
2020-06-04    50
2020-06-05    48
2020-06-06    44
2020-06-07    45
2020-06-08    44
2020-06-09    54
2020-06-10    42
2020-06-11    56
2020-06-12    55
2020-06-13    52
2020-06-14    59
2020-06-15    44
2020-06-16    42
2020-06-17    51
2020-06-18    41
2020-06-19    47
2020-06-20    50
2020-06-21    53
2020-06-22    41
2020-06-23    57
2020-06-24    50
2020-06-25    48
2020-06-26    57
2020-06-27    42
2020-06-28    44
2020-06-29    52
2020-06-30    57
Freq: D, dtype: int32
# 每7天采集一次数据,实现降采样操作
result = time_obj.resample('7D').mean()
result.astype("int64")
2020-06-01    50
2020-06-08    49
2020-06-15    47
2020-06-22    50
2020-06-29    46
Freq: 7D, dtype: int64

6.4 案例——中国篮球运动员的基本信息分析

import numpy as np
import pandas as pd
file_one = pd.read_csv('file:运动员信息采集01.csv', encoding='gbk')
file_two = pd.read_excel('file:运动员信息采集02.xlsx')
# 采用外连接的方式合并数据
all_data = pd.merge(left=file_one,right=file_two, how='outer')
# 筛选出国籍为中国的运动员
all_data = all_data[all_data['国籍'] == '中国']
# 查看DataFrame类对象的摘要,包括各列数据类型、非空值数量、内存使用情况等
all_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 361 entries, 2 to 548
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   中文名     361 non-null    object
 1   外文名     361 non-null    object
 2   性别      361 non-null    object
 3   国籍      361 non-null    object
 4   出生日期    314 non-null    object
 5   身高      215 non-null    object
 6   体重      201 non-null    object
 7   项目      360 non-null    object
 8   省份      350 non-null    object
dtypes: object(9)
memory usage: 28.2+ KB
# 检测all_data中是否有重复值
all_data[all_data.duplicated().values==True]
中文名外文名性别国籍出生日期身高体重项目省份
44莫有雪Mo Youxue中国1988年2月16日179cm65kg田径广东
56宁泽涛Ning Zetao中国1993年3月6日191cm76-80kg游泳河南
73彭林Peng Lin中国1995年4月4日184厘米72kg排球湖南
122孙梦昕Sun Meng Xin中国1993年190厘米77kg篮球山东
291周琦Zhou Qi中国1996年1月16日217厘米95kg篮球河南新乡
# 删除all_data中的重复值,并重新对数据进行索引
all_data = all_data.drop_duplicates(ignore_index=True)
all_data.head(10)
中文名外文名性别国籍出生日期身高体重项目省份
0毕晓琳Bi Xiaolin中国1989年9月18日NaNNaN足球辽宁
1马龙Ma Long中国1988年10月20日175cm72kg乒乓球辽宁
2吕小军Lv Xiaojun中国1984年7月27日172厘米77kg举重湖北
3林希妤Lin Xiyu中国1996年2月25日NaNNaN高尔夫广东
4李昊桐Li Haotong中国1995年8月3日183厘米75kg高尔夫湖南
5毛艺Mao Yi中国1999年9月NaNNaN体操辽宁
6苗甜Miao Tian中国1993年1月18日NaNNaN赛艇北京
7马晓旭MA Xiaoxu中国1988年6月5日NaNNaN足球辽宁
8马英楠Ma Ying Nan中国1984年NaNNaN柔道辽宁
9马青Ma Qing中国1992年8月24日NaNNaN皮划艇静水山东
# 筛选出项目为篮球的运动员
basketball_data= all_data[all_data['项目'] == '篮球']
# 访问“出生日期”一列的数据
basketball_data['出生日期']
34     1989年12月10日
60         1992年7月
61           1993年
67      1992年6月25日
89         1990年4月
100     1994年1月20日
161    1987年10月27日
182    1989年10月11日
192     1996年1月16日
201     1994年8月11日
211     1993年3月24日
213     1995年8月25日
214      1996年7月5日
219          30658
221          32235
244          34201
245          34701
246          33710
247          34943
248          1999年
249          1999年
250          35446
251          33786
252          35072
253          34547
265          33710
276          34287
285          32599
307          33757
316          31868
352          32964
Name: 出生日期, dtype: object
import datetime
basketball_data = basketball_data.copy()
# 将以“x”天显示的日期转换成以“x年x月x日”形式显示的日期
initial_time = datetime.datetime.strptime('1900-01-01', "%Y-%m-%d")
for i in basketball_data.loc[:, '出生日期']:
    if type(i) == int:
        new_time = (initial_time + datetime.timedelta(days=i)).strftime('%Y{y}%m{m}%d{d}').format(y='年', m='月', d='日')
        basketball_data.loc[:, '出生日期'] = basketball_data.loc[:, '出生日期'].replace(i, new_time)
# 为保证出生日期的一致性,这里统一使用只保留到年份的日期
basketball_data.loc[:, '出生日期'] = basketball_data['出生日期'].apply(lambda x:x[:5])
basketball_data['出生日期'].head(10)
34     1989年
60     1992年
61     1993年
67     1992年
89     1990年
100    1994年
161    1987年
182    1989年
192    1996年
201    1994年
Name: 出生日期, dtype: object
# 筛选男篮球运动员
male_data = basketball_data[basketball_data['性别'].apply(lambda x :x =='男')]
male_data = male_data.copy()
# 计算身高平均值(四舍五入取整)
male_height = male_data['身高'].dropna() 
fill_male_height = round(male_height.apply(lambda x : x[0:-2]).astype(int).mean())
fill_male_height = str(int(fill_male_height)) + '厘米'
# 填充缺失值
male_data.loc[:, '身高'] = male_data.loc[:, '身高'].fillna(fill_male_height)
# 为方便后期使用,这里将身高数据转换为整数
male_data.loc[:, '身高'] = male_data.loc[:, '身高'].apply(lambda x: x[0:-2]).astype(int)
# 重命名列标签索引
male_data.rename(columns={'身高':'身高/cm'}, inplace=True)
male_data
中文名外文名性别国籍出生日期身高/cm体重项目省份
67睢冉Sui Ran中国1992年19295kg篮球山西太原
100王哲林Wang Zhelin中国1994年214110kg篮球福建
161易建联Yi Jianlian中国1987年213113kg篮球广东
182周鹏Zhou Peng中国1989年20690kg篮球辽宁
192周琦Zhou Qi中国1996年21795kg篮球河南新乡
211翟晓川Zhai Xiaochuan中国1993年204100kg篮球河北唐山
213赵继伟Zhao Jiwei中国1995年18577kg篮球辽宁海城
214邹雨宸Zou yuchen中国1996年208108kg篮球辽宁大连
244丁彦雨航Di Yanyuhang中国1993年20091kg篮球新疆克拉玛依
276郭艾伦Guo Ailun中国1993年19285kg篮球辽宁
307李慕豪Li Muhao中国1992年203111kg篮球贵州贵阳
# 筛选女篮球运动员数据
female_data = basketball_data[basketball_data['性别'].apply(
                                                lambda x :x =='女')]
female_data = female_data.copy()
data = {'191cm':'191厘米','1米89公分':'189厘米','2.01米':'201厘米',
          '187公分':'187厘米','1.97M':'197厘米','1.98米':'198厘米',
          '192cm':'192厘米'}
female_data.loc[:, '身高'] = female_data.loc[:, '身高'].replace(data)
# 计算女篮球运动员平均身高
female_height = female_data['身高'].dropna()
fill_female_height = round(female_height.apply(lambda x : x[0:-2]).astype(int).mean())
fill_female_height =str(int(fill_female_height)) + '厘米'
# 填充缺失值
female_data.loc[:, '身高'] = female_data.loc[:,  '身高'].fillna(fill_female_height)
# 为方便后期使用,这里将身高数据转换为整数
female_data['身高'] = female_data['身高'].apply(lambda x : x[0:-2]).astype(int)
# 重命名列标签索引
female_data.rename(columns={'身高':'身高/cm'}, inplace=True)
female_data
中文名外文名性别国籍出生日期身高/cm体重项目省份
34邵婷Shao Ting中国1989年18875kg篮球上海
60孙梦然Sun Meng Ran中国1992年19777kg篮球天津
61孙梦昕Sun Meng Xin中国1993年19077kg篮球山东
89吴迪Wu Di中国1990年18672kg篮球天津
201赵志芳Zhao Zhi Fang中国1994年168NaN篮球NaN
219陈楠Chen Nan中国1983年19790kg篮球青岛胶南
221陈晓佳Chen Xiao Jia中国1988年18070kg篮球江苏无锡
245李梦Li Meng中国1995年19076kg篮球辽宁
246高颂Gao Song中国1992年19185kg篮球黑龙江
247潘臻琦Pan Zhen Qi中国1995年19182kg篮球河南
248张茹Zhang Ru中国1999年189NaN篮球河南
249李月汝Li Yue Ru中国1999年201103kg篮球山西
250郭子瑄Guo Zi Xuan中国1997年187NaN篮球河北
251孙梦然Sun Meng Ran中国1992年19777kg篮球天津
252黄思静Huang Si Jing中国1996年1928kg篮球广东
253张丽婷Zhang Li Ting中国1994年19888千克篮球湖北
265高颂Gao Song中国1992年19185kg篮球黑龙江
285黄红枇Huang Hong Pi中国1989年19580kg篮球广西南宁
316李珊珊Li Shan Shan中国1987年17770kg篮球江苏
352露雯Lu Wen中国1990年19178kg篮球内蒙古鄂尔多斯
female_data.loc[:, '体重'] = female_data.loc[:, '体重'].replace({'88千克': '88kg'})
female_data
中文名外文名性别国籍出生日期身高/cm体重项目省份
34邵婷Shao Ting中国1989年18875kg篮球上海
60孙梦然Sun Meng Ran中国1992年19777kg篮球天津
61孙梦昕Sun Meng Xin中国1993年19077kg篮球山东
89吴迪Wu Di中国1990年18672kg篮球天津
201赵志芳Zhao Zhi Fang中国1994年168NaN篮球NaN
219陈楠Chen Nan中国1983年19790kg篮球青岛胶南
221陈晓佳Chen Xiao Jia中国1988年18070kg篮球江苏无锡
245李梦Li Meng中国1995年19076kg篮球辽宁
246高颂Gao Song中国1992年19185kg篮球黑龙江
247潘臻琦Pan Zhen Qi中国1995年19182kg篮球河南
248张茹Zhang Ru中国1999年189NaN篮球河南
249李月汝Li Yue Ru中国1999年201103kg篮球山西
250郭子瑄Guo Zi Xuan中国1997年187NaN篮球河北
251孙梦然Sun Meng Ran中国1992年19777kg篮球天津
252黄思静Huang Si Jing中国1996年1928kg篮球广东
253张丽婷Zhang Li Ting中国1994年19888kg篮球湖北
265高颂Gao Song中国1992年19185kg篮球黑龙江
285黄红枇Huang Hong Pi中国1989年19580kg篮球广西南宁
316李珊珊Li Shan Shan中国1987年17770kg篮球江苏
352露雯Lu Wen中国1990年19178kg篮球内蒙古鄂尔多斯
# 采用前向填充的方式,替换体重为 8 的值
female_data['体重'].replace(to_replace='8kg', method='pad',inplace=True)
female_data
中文名外文名性别国籍出生日期身高/cm体重项目省份
34邵婷Shao Ting中国1989年18875kg篮球上海
60孙梦然Sun Meng Ran中国1992年19777kg篮球天津
61孙梦昕Sun Meng Xin中国1993年19077kg篮球山东
89吴迪Wu Di中国1990年18672kg篮球天津
201赵志芳Zhao Zhi Fang中国1994年168NaN篮球NaN
219陈楠Chen Nan中国1983年19790kg篮球青岛胶南
221陈晓佳Chen Xiao Jia中国1988年18070kg篮球江苏无锡
245李梦Li Meng中国1995年19076kg篮球辽宁
246高颂Gao Song中国1992年19185kg篮球黑龙江
247潘臻琦Pan Zhen Qi中国1995年19182kg篮球河南
248张茹Zhang Ru中国1999年189NaN篮球河南
249李月汝Li Yue Ru中国1999年201103kg篮球山西
250郭子瑄Guo Zi Xuan中国1997年187NaN篮球河北
251孙梦然Sun Meng Ran中国1992年19777kg篮球天津
252黄思静Huang Si Jing中国1996年19277kg篮球广东
253张丽婷Zhang Li Ting中国1994年19888kg篮球湖北
265高颂Gao Song中国1992年19185kg篮球黑龙江
285黄红枇Huang Hong Pi中国1989年19580kg篮球广西南宁
316李珊珊Li Shan Shan中国1987年17770kg篮球江苏
352露雯Lu Wen中国1990年19178kg篮球内蒙古鄂尔多斯
# 计算女篮球运动员的平均体重
female_weight = female_data['体重'].dropna()
female_weight = female_weight.apply(lambda x :x[0:-2]).astype(int)
fill_female_weight = round(female_weight.mean())
fill_female_weight = str(int(fill_female_weight)) + 'kg'
# 填充缺失值
female_data.loc[:,'体重'].fillna(fill_female_weight, inplace=True)
female_data
中文名外文名性别国籍出生日期身高/cm体重项目省份
34邵婷Shao Ting中国1989年18875kg篮球上海
60孙梦然Sun Meng Ran中国1992年19777kg篮球天津
61孙梦昕Sun Meng Xin中国1993年19077kg篮球山东
89吴迪Wu Di中国1990年18672kg篮球天津
201赵志芳Zhao Zhi Fang中国1994年16880kg篮球NaN
219陈楠Chen Nan中国1983年19790kg篮球青岛胶南
221陈晓佳Chen Xiao Jia中国1988年18070kg篮球江苏无锡
245李梦Li Meng中国1995年19076kg篮球辽宁
246高颂Gao Song中国1992年19185kg篮球黑龙江
247潘臻琦Pan Zhen Qi中国1995年19182kg篮球河南
248张茹Zhang Ru中国1999年18980kg篮球河南
249李月汝Li Yue Ru中国1999年201103kg篮球山西
250郭子瑄Guo Zi Xuan中国1997年18780kg篮球河北
251孙梦然Sun Meng Ran中国1992年19777kg篮球天津
252黄思静Huang Si Jing中国1996年19277kg篮球广东
253张丽婷Zhang Li Ting中国1994年19888kg篮球湖北
265高颂Gao Song中国1992年19185kg篮球黑龙江
285黄红枇Huang Hong Pi中国1989年19580kg篮球广西南宁
316李珊珊Li Shan Shan中国1987年17770kg篮球江苏
352露雯Lu Wen中国1990年19178kg篮球内蒙古鄂尔多斯
basketball_data = pd.concat([male_data, female_data])
basketball_data['体重'] = basketball_data['体重'].apply(lambda x : x[0:-2]).astype(int)
basketball_data.rename(columns={'体重':'体重/kg'}, inplace=True)
basketball_data.head(5)
中文名外文名性别国籍出生日期身高/cm体重/kg项目省份
67睢冉Sui Ran中国1992年19295篮球山西太原
100王哲林Wang Zhelin中国1994年214110篮球福建
161易建联Yi Jianlian中国1987年213113篮球广东
182周鹏Zhou Peng中国1989年20690篮球辽宁
192周琦Zhou Qi中国1996年21795篮球河南新乡
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 使用箱形图检测男篮运动员身高一列是否有异常值
male_data.boxplot(column=['身高/cm'])
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wfouDA5-1651584007786)(output_109_0.png)]

# 使用箱形图检测女篮运动员身高一列是否有异常值
female_data.boxplot(column=['身高/cm'])
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGy4eJpZ-1651584007787)(output_110_0.png)]

# 定义基于3σ原则检测的函数
def three_sigma(ser): 
    # 计算平均数
    mean_data = ser.mean()
    # 计算标准差
    std_data = ser.std()
    # 根据数值小于μ-3σ或大于μ+3σ均为异常值
    rule = (mean_data-3*std_data>ser) | (mean_data+3*std_data<ser)
    # 返回异常值的位置索引
    index = np.arange(ser.shape[0])[rule]
    # 获取异常值数据
    outliers = ser.iloc[index]
    return outliers
# 使用3σ原则检测女篮运动员的体重数据
female_weight = basketball_data[basketball_data['性别'] == '女']
three_sigma(female_weight['体重/kg'])
249    103
Name: 体重/kg, dtype: int32
# 使用3σ原则检测男篮运动员的体重数据
male_weight = basketball_data[basketball_data['性别'] == '男']
three_sigma(male_weight['体重/kg'])
Series([], Name: 体重/kg, dtype: int32)
# 以性别分组,对各分组执行求平均数操作,并要求平均数保留一位小数
basketball_data.groupby('性别').mean().round(1)
身高/cm体重/kg
性别
189.880.1
203.197.7
import matplotlib.pyplot as plt
# 设置图表中文字的字体为黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 根据出生日期计算年龄
ages = 2020 - basketball_data['出生日期'].apply(lambda x : x[0:-1]).astype(int)
# 根据计算的年龄值绘制直方图
ax = ages.plot(kind='hist')
# 设置直方图中x轴、y轴的标签为“年龄(岁)”和“频数”
ax.set_xlabel('年龄(岁)')
ax.set_ylabel('频数')
# 设置x轴的刻度为“ages的最小值, ages的最小值+2, ..., ages最大值+1”
ax.set_xticks(range(ages.min(),ages.max()+1, 2))
[<matplotlib.axis.XTick at 0x25fe54d6988>,
 <matplotlib.axis.XTick at 0x25fe54d4f48>,
 <matplotlib.axis.XTick at 0x25fe54e0d08>,
 <matplotlib.axis.XTick at 0x25fe5522588>,
 <matplotlib.axis.XTick at 0x25fe5522908>,
 <matplotlib.axis.XTick at 0x25fe5526248>,
 <matplotlib.axis.XTick at 0x25fe55266c8>,
 <matplotlib.axis.XTick at 0x25fe5526d08>,
 <matplotlib.axis.XTick at 0x25fe552b808>]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvM9LQvR-1651584007788)(output_114_1.png)]

# 增加“体质指数”一列
basketball_data['体质指数'] = 0
basketball_data.head(5)
中文名外文名性别国籍出生日期身高/cm体重/kg项目省份体质指数
67睢冉Sui Ran中国1992年19295篮球山西太原0
100王哲林Wang Zhelin中国1994年214110篮球福建0
161易建联Yi Jianlian中国1987年213113篮球广东0
182周鹏Zhou Peng中国1989年20690篮球辽宁0
192周琦Zhou Qi中国1996年21795篮球河南新乡0
# 计算体质指数
def outer(num):
    def ath_bmi(sum_bmi):
        weight = basketball_data['体重/kg']
        height = basketball_data['身高/cm'] 
        sum_bmi =  weight / (height/100)**2
        return num + sum_bmi
    return ath_bmi
basketball_data['体质指数'] = basketball_data[['体质指数']].apply(outer(basketball_data['体质指数'])).round(1)
basketball_data
中文名外文名性别国籍出生日期身高/cm体重/kg项目省份体质指数
67睢冉Sui Ran中国1992年19295篮球山西太原25.8
100王哲林Wang Zhelin中国1994年214110篮球福建24.0
161易建联Yi Jianlian中国1987年213113篮球广东24.9
182周鹏Zhou Peng中国1989年20690篮球辽宁21.2
192周琦Zhou Qi中国1996年21795篮球河南新乡20.2
211翟晓川Zhai Xiaochuan中国1993年204100篮球河北唐山24.0
213赵继伟Zhao Jiwei中国1995年18577篮球辽宁海城22.5
214邹雨宸Zou yuchen中国1996年208108篮球辽宁大连25.0
244丁彦雨航Di Yanyuhang中国1993年20091篮球新疆克拉玛依22.8
276郭艾伦Guo Ailun中国1993年19285篮球辽宁23.1
307李慕豪Li Muhao中国1992年203111篮球贵州贵阳26.9
34邵婷Shao Ting中国1989年18875篮球上海21.2
60孙梦然Sun Meng Ran中国1992年19777篮球天津19.8
61孙梦昕Sun Meng Xin中国1993年19077篮球山东21.3
89吴迪Wu Di中国1990年18672篮球天津20.8
201赵志芳Zhao Zhi Fang中国1994年16880篮球NaN28.3
219陈楠Chen Nan中国1983年19790篮球青岛胶南23.2
221陈晓佳Chen Xiao Jia中国1988年18070篮球江苏无锡21.6
245李梦Li Meng中国1995年19076篮球辽宁21.1
246高颂Gao Song中国1992年19185篮球黑龙江23.3
247潘臻琦Pan Zhen Qi中国1995年19182篮球河南22.5
248张茹Zhang Ru中国1999年18980篮球河南22.4
249李月汝Li Yue Ru中国1999年201103篮球山西25.5
250郭子瑄Guo Zi Xuan中国1997年18780篮球河北22.9
251孙梦然Sun Meng Ran中国1992年19777篮球天津19.8
252黄思静Huang Si Jing中国1996年19277篮球广东20.9
253张丽婷Zhang Li Ting中国1994年19888篮球湖北22.4
265高颂Gao Song中国1992年19185篮球黑龙江23.3
285黄红枇Huang Hong Pi中国1989年19580篮球广西南宁21.0
316李珊珊Li Shan Shan中国1987年17770篮球江苏22.3
352露雯Lu Wen中国1990年19178篮球内蒙古鄂尔多斯21.4
groupby_obj = basketball_data.groupby(by="性别")
females = dict([x for x in groupby_obj])['女']['体质指数'].values
# 统计体质指数为非正常的女篮运动员的数量
count = females[females < 19].size + females[females > 24].size
print(f'体质指数小于19:{females[females < 19]}')
print(f'体质指数大于24:{females[females > 24]}')
print(f'非正常体质范围的总人数:{count}')
体质指数小于19:[]
体质指数大于24:[28.3 25.5]
非正常体质范围的总人数:2
males = dict([x for x in groupby_obj])['男']['体质指数'].values
# 统计体质指数为非正常的男篮运动员的数量
count = males[males < 20].size + males[males > 25].size
print(f'体质指数小于20:{males[males < 20]}')
print(f'体质指数大于25:{males[males > 25]}')
print(f'非正常体质范围的总人数:{count}')
体质指数小于20:[]
体质指数大于25:[25.8 26.9]
非正常体质范围的总人数:2
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:19:11  更:2022-05-05 11:22:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:26:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码