目录
本博客所涉及的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 | 荣耀9X | 5月25日 | 999 |
---|
1 | 小米6x | 5月25日 | 1399 |
---|
2 | OPPO A1 | 5月25日 | 1399 |
---|
3 | 荣耀9X | 6月18日 | 800 |
---|
4 | 小米6x | 6月18日 | 1200 |
---|
5 | OPPO A1 | 6月18日 | 1250 |
---|
new_df = df_obj.pivot(index='出售日期', columns='商品名称',
values='价格(元)')
new_df
商品名称 | OPPO A1 | 小米6x | 荣耀9X |
---|
出售日期 | | | |
---|
5月25日 | 1399 | 1399 | 999 |
---|
6月18日 | 1250 | 1200 | 800 |
---|
6.2.5.1.2 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 A1 | 1399 |
---|
6月18日 | OPPO A1 | 1250 |
---|
5月25日 | 小米6x | 1399 |
---|
6月18日 | 小米6x | 1200 |
---|
5月25日 | 荣耀9X | 999 |
---|
6月18日 | 荣耀9X | 800 |
---|
练习例子: 原数据:
处理后数据:
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
| date | hour | type | 北京 | 天津 | 石家庄 | 唐山 |
---|
0 | 20150901 | 12 | AQI | 24 | 25 | 24 | 24 |
---|
1 | 20150901 | 12 | PM2.5_24h | 14 | 22 | 20 | 9 |
---|
2 | 20150901 | 12 | PM10_24h | 20 | 25 | 32 | 20 |
---|
2. 数据处理
根据需求可以观察到需要将“北京”,“天津”,“石家庄”和“唐山”这四列变换为一行,同时保留type列的类容。
2.1 列变行
df_melt=df.melt(id_vars=['date','hour','type'],var_name='City')
df_melt
| date | hour | type | City | value |
---|
0 | 20150901 | 12 | AQI | 北京 | 24 |
---|
1 | 20150901 | 12 | PM2.5_24h | 北京 | 14 |
---|
2 | 20150901 | 12 | PM10_24h | 北京 | 20 |
---|
3 | 20150901 | 12 | AQI | 天津 | 25 |
---|
4 | 20150901 | 12 | PM2.5_24h | 天津 | 22 |
---|
5 | 20150901 | 12 | PM10_24h | 天津 | 25 |
---|
6 | 20150901 | 12 | AQI | 石家庄 | 24 |
---|
7 | 20150901 | 12 | PM2.5_24h | 石家庄 | 20 |
---|
8 | 20150901 | 12 | PM10_24h | 石家庄 | 32 |
---|
9 | 20150901 | 12 | AQI | 唐山 | 24 |
---|
10 | 20150901 | 12 | PM2.5_24h | 唐山 | 9 |
---|
11 | 20150901 | 12 | PM10_24h | 唐山 | 20 |
---|
2.2 行变列
df_melt_pivot = df_melt.pivot(index=['date','hour','City'],columns='type',values='value').reset_index()
df_melt_pivot
type | date | hour | City | AQI | PM10_24h | PM2.5_24h |
---|
0 | 20150901 | 12 | 北京 | 24 | 20 | 14 |
---|
1 | 20150901 | 12 | 唐山 | 24 | 20 | 9 |
---|
2 | 20150901 | 12 | 天津 | 25 | 25 | 22 |
---|
3 | 20150901 | 12 | 石家庄 | 24 | 32 | 20 |
---|
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)
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()
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 总学分 | 备注 |
---|
0 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 58 | NaN |
---|
1 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 58 | NaN |
---|
2 | 81103 | 王燕 | 计算机 | 0 | 1989-10-06 | 58 | NaN |
---|
3 | 81104 | 韦严平 | 计算机 | 1 | 1990-08-26 | 58 | NaN |
---|
4 | 81106 | 李方方 | 计算机 | 1 | 1990-11-20 | 58 | NaN |
---|
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
| 课程号 | 课程名 | 开课学期 | 学时 | 学分 |
---|
0 | 101 | 计算机基础 | 1 | 80 | 5 |
---|
1 | 102 | 程序设计与语言 | 2 | 68 | 4 |
---|
2 | 206 | 离散数学 | 4 | 68 | 4 |
---|
3 | 208 | 数据结构 | 5 | 68 | 4 |
---|
4 | 209 | 操作系统 | 6 | 68 | 4 |
---|
5 | 210 | 计算机原理 | 5 | 85 | 5 |
---|
6 | 212 | 数据库原理 | 7 | 68 | 4 |
---|
7 | 301 | 计算机网络 | 7 | 51 | 3 |
---|
8 | 302 | 软件工程 | 7 | 51 | 3 |
---|
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()
| 学号 | 课程号 | 成绩 |
---|
0 | 81101 | 101 | 80 |
---|
1 | 81101 | 102 | 78 |
---|
2 | 81101 | 206 | 76 |
---|
3 | 81102 | 102 | 78 |
---|
4 | 81102 | 206 | 78 |
---|
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 | 学号 | 姓名 | 专业 | 性别 | 出生年月 | 总学分 | 备注 | 课程号 | 成绩 | 课程名 | 开课学期 | 学时 | 学分 |
---|
0 | 0 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 58 | NaN | 101.0 | 80.0 | 计算机基础 | 1.0 | 80.0 | 5.0 |
---|
1 | 0 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 58 | NaN | 102.0 | 78.0 | 程序设计与语言 | 2.0 | 68.0 | 4.0 |
---|
2 | 0 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 58 | NaN | 206.0 | 76.0 | 离散数学 | 4.0 | 68.0 | 4.0 |
---|
3 | 1 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 58 | NaN | 102.0 | 78.0 | 程序设计与语言 | 2.0 | 68.0 | 4.0 |
---|
4 | 1 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 58 | NaN | 206.0 | 78.0 | 离散数学 | 4.0 | 68.0 | 4.0 |
---|
df_data = df_stu_course_study[["学号","姓名","专业","性别","出生年月","课程号","课程名","成绩","总学分"]]
df_data.head()
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
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 |
---|
3 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 102.0 | 程序设计与语言 | 78.0 | 58 |
---|
4 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 206.0 | 离散数学 | 78.0 | 58 |
---|
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
stuNo_Grp = df_data.groupby(by="学号")
stuNo_Grp
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000025FE1A18F08>
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]
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
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 |
---|
总结: 当我们根据某个字段进行group机制分组的时候,最后能够生成多少个子DataFrame,取决于我们的字段中有多少个不同的元素(案例有43个); 当我们分组之后,便可以进行后续的各种聚合操作,比如sum、mean、min等。
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)
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
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 |
---|
- DataFrame.groupby()使用示例:
- 2. DataFrameGroupBy对象
- D.同一个列名使用不同聚合函数
分组之后对同一个列名使用不同的函数,函数使用列表形式:下面表示的是对成绩分别求和、最大值、最小值、均值、个数(size)
df_Scores = df_data.groupby("学号")["成绩"].agg(["sum","max","min","mean","size"])
df_Scores
| sum | max | min | mean | size |
---|
学号 | | | | | |
---|
81101 | 234.0 | 80.0 | 76.0 | 78.000000 | 3 |
---|
81102 | 156.0 | 78.0 | 78.0 | 78.000000 | 2 |
---|
81103 | 203.0 | 81.0 | 52.0 | 67.666667 | 3 |
---|
81104 | 239.0 | 90.0 | 65.0 | 79.666667 | 3 |
---|
81106 | 211.0 | 81.0 | 59.0 | 70.333333 | 3 |
---|
81107 | 226.0 | 80.0 | 68.0 | 75.333333 | 3 |
---|
81108 | 227.0 | 87.0 | 55.0 | 75.666667 | 3 |
---|
81109 | 219.0 | 83.0 | 66.0 | 73.000000 | 3 |
---|
81110 | 274.0 | 95.0 | 89.0 | 91.333333 | 3 |
---|
81111 | 237.0 | 91.0 | 70.0 | 79.000000 | 3 |
---|
81113 | 202.0 | 79.0 | 60.0 | 67.333333 | 3 |
---|
81201 | 80.0 | 80.0 | 80.0 | 80.000000 | 1 |
---|
81202 | 58.0 | 58.0 | 58.0 | 58.000000 | 1 |
---|
81203 | 87.0 | 87.0 | 87.0 | 87.000000 | 1 |
---|
81204 | 91.0 | 91.0 | 91.0 | 91.000000 | 1 |
---|
81206 | 0.0 | NaN | NaN | NaN | 1 |
---|
81210 | 76.0 | 76.0 | 76.0 | 76.000000 | 1 |
---|
81216 | 81.0 | 81.0 | 81.0 | 81.000000 | 1 |
---|
81218 | 70.0 | 70.0 | 70.0 | 70.000000 | 1 |
---|
81220 | 82.0 | 82.0 | 82.0 | 82.000000 | 1 |
---|
81221 | 76.0 | 76.0 | 76.0 | 76.000000 | 1 |
---|
81251 | 0.0 | NaN | NaN | NaN | 1 |
---|
81255 | 0.0 | NaN | NaN | NaN | 1 |
---|
df_data.head()
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
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 |
---|
3 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 102.0 | 程序设计与语言 | 78.0 | 58 |
---|
4 | 81102 | 程明 | 计算机 | 1 | 1991-02-01 | 206.0 | 离散数学 | 78.0 | 58 |
---|
将数据按专业、学号进行分组
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]
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
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][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聚合操作
-
聚合操作示例:
stuNo_SumScore = df_data.groupby("学号").agg({"成绩":"sum"})
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 |
---|
一般情况下,结果是一个以分组字段为行索引的数据帧,那如果我们也想把这个行索引变成数据帧中的一个列名属性,使用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)
| 学号 | 姓名 | 专业 | 性别 | 出生年月 | 课程号 | 课程名 | 成绩 | 总学分 |
---|
0 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 101.0 | 计算机基础 | 80.0 | 58 |
---|
1 | 81101 | 刘华 | 通信工程 | 1 | 1991-03-08 | 102.0 | 程序设计与语言 | 78.0 | 58 |
---|
stu_SumScore_CountCourse = df_data.groupby("学号").agg({"成绩":"sum","课程名":"count"})
stu_SumScore_CountCourse
| 成绩 | 课程名 |
---|
学号 | | |
---|
81101 | 234.0 | 3 |
---|
81102 | 156.0 | 2 |
---|
81103 | 203.0 | 3 |
---|
81104 | 239.0 | 3 |
---|
81106 | 211.0 | 3 |
---|
81107 | 226.0 | 3 |
---|
81108 | 227.0 | 3 |
---|
81109 | 219.0 | 3 |
---|
81110 | 274.0 | 3 |
---|
81111 | 237.0 | 3 |
---|
81113 | 202.0 | 3 |
---|
81201 | 80.0 | 1 |
---|
81202 | 58.0 | 1 |
---|
81203 | 87.0 | 1 |
---|
81204 | 91.0 | 1 |
---|
81206 | 0.0 | 0 |
---|
81210 | 76.0 | 1 |
---|
81216 | 81.0 | 1 |
---|
81218 | 70.0 | 1 |
---|
81220 | 82.0 | 1 |
---|
81221 | 76.0 | 1 |
---|
81251 | 0.0 | 0 |
---|
81255 | 0.0 | 0 |
---|
给生成的新列重新起给名字
stu_SumScore_CountCourse.columns = ["总分","科目数"]
stu_SumScore_CountCourse
| 总分 | 科目数 |
---|
学号 | | |
---|
81101 | 234.0 | 3 |
---|
81102 | 156.0 | 2 |
---|
81103 | 203.0 | 3 |
---|
81104 | 239.0 | 3 |
---|
81106 | 211.0 | 3 |
---|
81107 | 226.0 | 3 |
---|
81108 | 227.0 | 3 |
---|
81109 | 219.0 | 3 |
---|
81110 | 274.0 | 3 |
---|
81111 | 237.0 | 3 |
---|
81113 | 202.0 | 3 |
---|
81201 | 80.0 | 1 |
---|
81202 | 58.0 | 1 |
---|
81203 | 87.0 | 1 |
---|
81204 | 91.0 | 1 |
---|
81206 | 0.0 | 0 |
---|
81210 | 76.0 | 1 |
---|
81216 | 81.0 | 1 |
---|
81218 | 70.0 | 1 |
---|
81220 | 82.0 | 1 |
---|
81221 | 76.0 | 1 |
---|
81251 | 0.0 | 0 |
---|
81255 | 0.0 | 0 |
---|
stu_SumScore_CountCourse = df_data.groupby("学号").agg({"成绩":"sum","课程名":"count"}).rename(columns={"成绩":"总成绩","课程名":"选修课程数"})
stu_SumScore_CountCourse
| 总成绩 | 选修课程数 |
---|
学号 | | |
---|
81101 | 234.0 | 3 |
---|
81102 | 156.0 | 2 |
---|
81103 | 203.0 | 3 |
---|
81104 | 239.0 | 3 |
---|
81106 | 211.0 | 3 |
---|
81107 | 226.0 | 3 |
---|
81108 | 227.0 | 3 |
---|
81109 | 219.0 | 3 |
---|
81110 | 274.0 | 3 |
---|
81111 | 237.0 | 3 |
---|
81113 | 202.0 | 3 |
---|
81201 | 80.0 | 1 |
---|
81202 | 58.0 | 1 |
---|
81203 | 87.0 | 1 |
---|
81204 | 91.0 | 1 |
---|
81206 | 0.0 | 0 |
---|
81210 | 76.0 | 1 |
---|
81216 | 81.0 | 1 |
---|
81218 | 70.0 | 1 |
---|
81220 | 82.0 | 1 |
---|
81221 | 76.0 | 1 |
---|
81251 | 0.0 | 0 |
---|
81255 | 0.0 | 0 |
---|
- 聚合操作示例:
- 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(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
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]
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(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
df.index
RangeIndex(start=0, stop=3, step=1)
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(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
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['国籍'] == '中国']
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.duplicated().values==True]
| 中文名 | 外文名 | 性别 | 国籍 | 出生日期 | 身高 | 体重 | 项目 | 省份 |
---|
44 | 莫有雪 | Mo Youxue | 男 | 中国 | 1988年2月16日 | 179cm | 65kg | 田径 | 广东 |
---|
56 | 宁泽涛 | Ning Zetao | 男 | 中国 | 1993年3月6日 | 191cm | 76-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.drop_duplicates(ignore_index=True)
all_data.head(10)
| 中文名 | 外文名 | 性别 | 国籍 | 出生日期 | 身高 | 体重 | 项目 | 省份 |
---|
0 | 毕晓琳 | Bi Xiaolin | 女 | 中国 | 1989年9月18日 | NaN | NaN | 足球 | 辽宁 |
---|
1 | 马龙 | Ma Long | 男 | 中国 | 1988年10月20日 | 175cm | 72kg | 乒乓球 | 辽宁 |
---|
2 | 吕小军 | Lv Xiaojun | 男 | 中国 | 1984年7月27日 | 172厘米 | 77kg | 举重 | 湖北 |
---|
3 | 林希妤 | Lin Xiyu | 女 | 中国 | 1996年2月25日 | NaN | NaN | 高尔夫 | 广东 |
---|
4 | 李昊桐 | Li Haotong | 男 | 中国 | 1995年8月3日 | 183厘米 | 75kg | 高尔夫 | 湖南 |
---|
5 | 毛艺 | Mao Yi | 女 | 中国 | 1999年9月 | NaN | NaN | 体操 | 辽宁 |
---|
6 | 苗甜 | Miao Tian | 女 | 中国 | 1993年1月18日 | NaN | NaN | 赛艇 | 北京 |
---|
7 | 马晓旭 | MA Xiaoxu | 女 | 中国 | 1988年6月5日 | NaN | NaN | 足球 | 辽宁 |
---|
8 | 马英楠 | Ma Ying Nan | 女 | 中国 | 1984年 | NaN | NaN | 柔道 | 辽宁 |
---|
9 | 马青 | Ma Qing | 女 | 中国 | 1992年8月24日 | NaN | NaN | 皮划艇静水 | 山东 |
---|
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()
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年 | 192 | 95kg | 篮球 | 山西太原 |
---|
100 | 王哲林 | Wang Zhelin | 男 | 中国 | 1994年 | 214 | 110kg | 篮球 | 福建 |
---|
161 | 易建联 | Yi Jianlian | 男 | 中国 | 1987年 | 213 | 113kg | 篮球 | 广东 |
---|
182 | 周鹏 | Zhou Peng | 男 | 中国 | 1989年 | 206 | 90kg | 篮球 | 辽宁 |
---|
192 | 周琦 | Zhou Qi | 男 | 中国 | 1996年 | 217 | 95kg | 篮球 | 河南新乡 |
---|
211 | 翟晓川 | Zhai Xiaochuan | 男 | 中国 | 1993年 | 204 | 100kg | 篮球 | 河北唐山 |
---|
213 | 赵继伟 | Zhao Jiwei | 男 | 中国 | 1995年 | 185 | 77kg | 篮球 | 辽宁海城 |
---|
214 | 邹雨宸 | Zou yuchen | 男 | 中国 | 1996年 | 208 | 108kg | 篮球 | 辽宁大连 |
---|
244 | 丁彦雨航 | Di Yanyuhang | 男 | 中国 | 1993年 | 200 | 91kg | 篮球 | 新疆克拉玛依 |
---|
276 | 郭艾伦 | Guo Ailun | 男 | 中国 | 1993年 | 192 | 85kg | 篮球 | 辽宁 |
---|
307 | 李慕豪 | Li Muhao | 男 | 中国 | 1992年 | 203 | 111kg | 篮球 | 贵州贵阳 |
---|
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年 | 188 | 75kg | 篮球 | 上海 |
---|
60 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
61 | 孙梦昕 | Sun Meng Xin | 女 | 中国 | 1993年 | 190 | 77kg | 篮球 | 山东 |
---|
89 | 吴迪 | Wu Di | 女 | 中国 | 1990年 | 186 | 72kg | 篮球 | 天津 |
---|
201 | 赵志芳 | Zhao Zhi Fang | 女 | 中国 | 1994年 | 168 | NaN | 篮球 | NaN |
---|
219 | 陈楠 | Chen Nan | 女 | 中国 | 1983年 | 197 | 90kg | 篮球 | 青岛胶南 |
---|
221 | 陈晓佳 | Chen Xiao Jia | 女 | 中国 | 1988年 | 180 | 70kg | 篮球 | 江苏无锡 |
---|
245 | 李梦 | Li Meng | 女 | 中国 | 1995年 | 190 | 76kg | 篮球 | 辽宁 |
---|
246 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
247 | 潘臻琦 | Pan Zhen Qi | 女 | 中国 | 1995年 | 191 | 82kg | 篮球 | 河南 |
---|
248 | 张茹 | Zhang Ru | 女 | 中国 | 1999年 | 189 | NaN | 篮球 | 河南 |
---|
249 | 李月汝 | Li Yue Ru | 女 | 中国 | 1999年 | 201 | 103kg | 篮球 | 山西 |
---|
250 | 郭子瑄 | Guo Zi Xuan | 女 | 中国 | 1997年 | 187 | NaN | 篮球 | 河北 |
---|
251 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
252 | 黄思静 | Huang Si Jing | 女 | 中国 | 1996年 | 192 | 8kg | 篮球 | 广东 |
---|
253 | 张丽婷 | Zhang Li Ting | 女 | 中国 | 1994年 | 198 | 88千克 | 篮球 | 湖北 |
---|
265 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
285 | 黄红枇 | Huang Hong Pi | 女 | 中国 | 1989年 | 195 | 80kg | 篮球 | 广西南宁 |
---|
316 | 李珊珊 | Li Shan Shan | 女 | 中国 | 1987年 | 177 | 70kg | 篮球 | 江苏 |
---|
352 | 露雯 | Lu Wen | 女 | 中国 | 1990年 | 191 | 78kg | 篮球 | 内蒙古鄂尔多斯 |
---|
female_data.loc[:, '体重'] = female_data.loc[:, '体重'].replace({'88千克': '88kg'})
female_data
| 中文名 | 外文名 | 性别 | 国籍 | 出生日期 | 身高/cm | 体重 | 项目 | 省份 |
---|
34 | 邵婷 | Shao Ting | 女 | 中国 | 1989年 | 188 | 75kg | 篮球 | 上海 |
---|
60 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
61 | 孙梦昕 | Sun Meng Xin | 女 | 中国 | 1993年 | 190 | 77kg | 篮球 | 山东 |
---|
89 | 吴迪 | Wu Di | 女 | 中国 | 1990年 | 186 | 72kg | 篮球 | 天津 |
---|
201 | 赵志芳 | Zhao Zhi Fang | 女 | 中国 | 1994年 | 168 | NaN | 篮球 | NaN |
---|
219 | 陈楠 | Chen Nan | 女 | 中国 | 1983年 | 197 | 90kg | 篮球 | 青岛胶南 |
---|
221 | 陈晓佳 | Chen Xiao Jia | 女 | 中国 | 1988年 | 180 | 70kg | 篮球 | 江苏无锡 |
---|
245 | 李梦 | Li Meng | 女 | 中国 | 1995年 | 190 | 76kg | 篮球 | 辽宁 |
---|
246 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
247 | 潘臻琦 | Pan Zhen Qi | 女 | 中国 | 1995年 | 191 | 82kg | 篮球 | 河南 |
---|
248 | 张茹 | Zhang Ru | 女 | 中国 | 1999年 | 189 | NaN | 篮球 | 河南 |
---|
249 | 李月汝 | Li Yue Ru | 女 | 中国 | 1999年 | 201 | 103kg | 篮球 | 山西 |
---|
250 | 郭子瑄 | Guo Zi Xuan | 女 | 中国 | 1997年 | 187 | NaN | 篮球 | 河北 |
---|
251 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
252 | 黄思静 | Huang Si Jing | 女 | 中国 | 1996年 | 192 | 8kg | 篮球 | 广东 |
---|
253 | 张丽婷 | Zhang Li Ting | 女 | 中国 | 1994年 | 198 | 88kg | 篮球 | 湖北 |
---|
265 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
285 | 黄红枇 | Huang Hong Pi | 女 | 中国 | 1989年 | 195 | 80kg | 篮球 | 广西南宁 |
---|
316 | 李珊珊 | Li Shan Shan | 女 | 中国 | 1987年 | 177 | 70kg | 篮球 | 江苏 |
---|
352 | 露雯 | Lu Wen | 女 | 中国 | 1990年 | 191 | 78kg | 篮球 | 内蒙古鄂尔多斯 |
---|
female_data['体重'].replace(to_replace='8kg', method='pad',inplace=True)
female_data
| 中文名 | 外文名 | 性别 | 国籍 | 出生日期 | 身高/cm | 体重 | 项目 | 省份 |
---|
34 | 邵婷 | Shao Ting | 女 | 中国 | 1989年 | 188 | 75kg | 篮球 | 上海 |
---|
60 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
61 | 孙梦昕 | Sun Meng Xin | 女 | 中国 | 1993年 | 190 | 77kg | 篮球 | 山东 |
---|
89 | 吴迪 | Wu Di | 女 | 中国 | 1990年 | 186 | 72kg | 篮球 | 天津 |
---|
201 | 赵志芳 | Zhao Zhi Fang | 女 | 中国 | 1994年 | 168 | NaN | 篮球 | NaN |
---|
219 | 陈楠 | Chen Nan | 女 | 中国 | 1983年 | 197 | 90kg | 篮球 | 青岛胶南 |
---|
221 | 陈晓佳 | Chen Xiao Jia | 女 | 中国 | 1988年 | 180 | 70kg | 篮球 | 江苏无锡 |
---|
245 | 李梦 | Li Meng | 女 | 中国 | 1995年 | 190 | 76kg | 篮球 | 辽宁 |
---|
246 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
247 | 潘臻琦 | Pan Zhen Qi | 女 | 中国 | 1995年 | 191 | 82kg | 篮球 | 河南 |
---|
248 | 张茹 | Zhang Ru | 女 | 中国 | 1999年 | 189 | NaN | 篮球 | 河南 |
---|
249 | 李月汝 | Li Yue Ru | 女 | 中国 | 1999年 | 201 | 103kg | 篮球 | 山西 |
---|
250 | 郭子瑄 | Guo Zi Xuan | 女 | 中国 | 1997年 | 187 | NaN | 篮球 | 河北 |
---|
251 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
252 | 黄思静 | Huang Si Jing | 女 | 中国 | 1996年 | 192 | 77kg | 篮球 | 广东 |
---|
253 | 张丽婷 | Zhang Li Ting | 女 | 中国 | 1994年 | 198 | 88kg | 篮球 | 湖北 |
---|
265 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
285 | 黄红枇 | Huang Hong Pi | 女 | 中国 | 1989年 | 195 | 80kg | 篮球 | 广西南宁 |
---|
316 | 李珊珊 | Li Shan Shan | 女 | 中国 | 1987年 | 177 | 70kg | 篮球 | 江苏 |
---|
352 | 露雯 | Lu Wen | 女 | 中国 | 1990年 | 191 | 78kg | 篮球 | 内蒙古鄂尔多斯 |
---|
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年 | 188 | 75kg | 篮球 | 上海 |
---|
60 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
61 | 孙梦昕 | Sun Meng Xin | 女 | 中国 | 1993年 | 190 | 77kg | 篮球 | 山东 |
---|
89 | 吴迪 | Wu Di | 女 | 中国 | 1990年 | 186 | 72kg | 篮球 | 天津 |
---|
201 | 赵志芳 | Zhao Zhi Fang | 女 | 中国 | 1994年 | 168 | 80kg | 篮球 | NaN |
---|
219 | 陈楠 | Chen Nan | 女 | 中国 | 1983年 | 197 | 90kg | 篮球 | 青岛胶南 |
---|
221 | 陈晓佳 | Chen Xiao Jia | 女 | 中国 | 1988年 | 180 | 70kg | 篮球 | 江苏无锡 |
---|
245 | 李梦 | Li Meng | 女 | 中国 | 1995年 | 190 | 76kg | 篮球 | 辽宁 |
---|
246 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
247 | 潘臻琦 | Pan Zhen Qi | 女 | 中国 | 1995年 | 191 | 82kg | 篮球 | 河南 |
---|
248 | 张茹 | Zhang Ru | 女 | 中国 | 1999年 | 189 | 80kg | 篮球 | 河南 |
---|
249 | 李月汝 | Li Yue Ru | 女 | 中国 | 1999年 | 201 | 103kg | 篮球 | 山西 |
---|
250 | 郭子瑄 | Guo Zi Xuan | 女 | 中国 | 1997年 | 187 | 80kg | 篮球 | 河北 |
---|
251 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77kg | 篮球 | 天津 |
---|
252 | 黄思静 | Huang Si Jing | 女 | 中国 | 1996年 | 192 | 77kg | 篮球 | 广东 |
---|
253 | 张丽婷 | Zhang Li Ting | 女 | 中国 | 1994年 | 198 | 88kg | 篮球 | 湖北 |
---|
265 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85kg | 篮球 | 黑龙江 |
---|
285 | 黄红枇 | Huang Hong Pi | 女 | 中国 | 1989年 | 195 | 80kg | 篮球 | 广西南宁 |
---|
316 | 李珊珊 | Li Shan Shan | 女 | 中国 | 1987年 | 177 | 70kg | 篮球 | 江苏 |
---|
352 | 露雯 | Lu Wen | 女 | 中国 | 1990年 | 191 | 78kg | 篮球 | 内蒙古鄂尔多斯 |
---|
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年 | 192 | 95 | 篮球 | 山西太原 |
---|
100 | 王哲林 | Wang Zhelin | 男 | 中国 | 1994年 | 214 | 110 | 篮球 | 福建 |
---|
161 | 易建联 | Yi Jianlian | 男 | 中国 | 1987年 | 213 | 113 | 篮球 | 广东 |
---|
182 | 周鹏 | Zhou Peng | 男 | 中国 | 1989年 | 206 | 90 | 篮球 | 辽宁 |
---|
192 | 周琦 | Zhou Qi | 男 | 中国 | 1996年 | 217 | 95 | 篮球 | 河南新乡 |
---|
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)]
def three_sigma(ser):
mean_data = ser.mean()
std_data = ser.std()
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
female_weight = basketball_data[basketball_data['性别'] == '女']
three_sigma(female_weight['体重/kg'])
249 103
Name: 体重/kg, dtype: int32
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.8 | 80.1 |
---|
男 | 203.1 | 97.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')
ax.set_xlabel('年龄(岁)')
ax.set_ylabel('频数')
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年 | 192 | 95 | 篮球 | 山西太原 | 0 |
---|
100 | 王哲林 | Wang Zhelin | 男 | 中国 | 1994年 | 214 | 110 | 篮球 | 福建 | 0 |
---|
161 | 易建联 | Yi Jianlian | 男 | 中国 | 1987年 | 213 | 113 | 篮球 | 广东 | 0 |
---|
182 | 周鹏 | Zhou Peng | 男 | 中国 | 1989年 | 206 | 90 | 篮球 | 辽宁 | 0 |
---|
192 | 周琦 | Zhou Qi | 男 | 中国 | 1996年 | 217 | 95 | 篮球 | 河南新乡 | 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年 | 192 | 95 | 篮球 | 山西太原 | 25.8 |
---|
100 | 王哲林 | Wang Zhelin | 男 | 中国 | 1994年 | 214 | 110 | 篮球 | 福建 | 24.0 |
---|
161 | 易建联 | Yi Jianlian | 男 | 中国 | 1987年 | 213 | 113 | 篮球 | 广东 | 24.9 |
---|
182 | 周鹏 | Zhou Peng | 男 | 中国 | 1989年 | 206 | 90 | 篮球 | 辽宁 | 21.2 |
---|
192 | 周琦 | Zhou Qi | 男 | 中国 | 1996年 | 217 | 95 | 篮球 | 河南新乡 | 20.2 |
---|
211 | 翟晓川 | Zhai Xiaochuan | 男 | 中国 | 1993年 | 204 | 100 | 篮球 | 河北唐山 | 24.0 |
---|
213 | 赵继伟 | Zhao Jiwei | 男 | 中国 | 1995年 | 185 | 77 | 篮球 | 辽宁海城 | 22.5 |
---|
214 | 邹雨宸 | Zou yuchen | 男 | 中国 | 1996年 | 208 | 108 | 篮球 | 辽宁大连 | 25.0 |
---|
244 | 丁彦雨航 | Di Yanyuhang | 男 | 中国 | 1993年 | 200 | 91 | 篮球 | 新疆克拉玛依 | 22.8 |
---|
276 | 郭艾伦 | Guo Ailun | 男 | 中国 | 1993年 | 192 | 85 | 篮球 | 辽宁 | 23.1 |
---|
307 | 李慕豪 | Li Muhao | 男 | 中国 | 1992年 | 203 | 111 | 篮球 | 贵州贵阳 | 26.9 |
---|
34 | 邵婷 | Shao Ting | 女 | 中国 | 1989年 | 188 | 75 | 篮球 | 上海 | 21.2 |
---|
60 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77 | 篮球 | 天津 | 19.8 |
---|
61 | 孙梦昕 | Sun Meng Xin | 女 | 中国 | 1993年 | 190 | 77 | 篮球 | 山东 | 21.3 |
---|
89 | 吴迪 | Wu Di | 女 | 中国 | 1990年 | 186 | 72 | 篮球 | 天津 | 20.8 |
---|
201 | 赵志芳 | Zhao Zhi Fang | 女 | 中国 | 1994年 | 168 | 80 | 篮球 | NaN | 28.3 |
---|
219 | 陈楠 | Chen Nan | 女 | 中国 | 1983年 | 197 | 90 | 篮球 | 青岛胶南 | 23.2 |
---|
221 | 陈晓佳 | Chen Xiao Jia | 女 | 中国 | 1988年 | 180 | 70 | 篮球 | 江苏无锡 | 21.6 |
---|
245 | 李梦 | Li Meng | 女 | 中国 | 1995年 | 190 | 76 | 篮球 | 辽宁 | 21.1 |
---|
246 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85 | 篮球 | 黑龙江 | 23.3 |
---|
247 | 潘臻琦 | Pan Zhen Qi | 女 | 中国 | 1995年 | 191 | 82 | 篮球 | 河南 | 22.5 |
---|
248 | 张茹 | Zhang Ru | 女 | 中国 | 1999年 | 189 | 80 | 篮球 | 河南 | 22.4 |
---|
249 | 李月汝 | Li Yue Ru | 女 | 中国 | 1999年 | 201 | 103 | 篮球 | 山西 | 25.5 |
---|
250 | 郭子瑄 | Guo Zi Xuan | 女 | 中国 | 1997年 | 187 | 80 | 篮球 | 河北 | 22.9 |
---|
251 | 孙梦然 | Sun Meng Ran | 女 | 中国 | 1992年 | 197 | 77 | 篮球 | 天津 | 19.8 |
---|
252 | 黄思静 | Huang Si Jing | 女 | 中国 | 1996年 | 192 | 77 | 篮球 | 广东 | 20.9 |
---|
253 | 张丽婷 | Zhang Li Ting | 女 | 中国 | 1994年 | 198 | 88 | 篮球 | 湖北 | 22.4 |
---|
265 | 高颂 | Gao Song | 女 | 中国 | 1992年 | 191 | 85 | 篮球 | 黑龙江 | 23.3 |
---|
285 | 黄红枇 | Huang Hong Pi | 女 | 中国 | 1989年 | 195 | 80 | 篮球 | 广西南宁 | 21.0 |
---|
316 | 李珊珊 | Li Shan Shan | 女 | 中国 | 1987年 | 177 | 70 | 篮球 | 江苏 | 22.3 |
---|
352 | 露雯 | Lu Wen | 女 | 中国 | 1990年 | 191 | 78 | 篮球 | 内蒙古鄂尔多斯 | 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
|