当前位置: 首页 > news >正文

Python数据预处理

Python数据预处理

# 2.1 Python的基本数据结构

【代码框2-1】—— 创建列表

# 创建列表
l1 = [2, 3, 4, 5]        # 元素同为数字的列表
l1                          
[2, 3, 4, 5]
l2=['甲','乙','丙','丁'] # 元素同为字符串的列表
l2               
['甲', '乙', '丙', '丁']
l3 = ['甲', 23, True, [1,2,3]] # 不同类型元素的列表
l3
['甲', 23, True, [1, 2, 3]]
l4 = list(range(10))          # 用range函数生成等差数列,起始为值0,步长为1
l4
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l5=list(range(100, 200, 20))  # 在100~200之间生成数列,步长为20
l5
[100, 120, 140, 160, 180]
## 注:range函数是Python的内置函数,用于生成整数等差序列,共有3个参数,分别是起始值、终点值和步长。默认起始值为0,也可以为负值,但不能为小数,默认步长为1,生成规则是左闭右开。

【代码框2-2】——列表的几种不同操作

# 向列表添加或插入元素
l1 = [2, 3, 4, 5]
l1.append(6)   # 将数字6添加到列表l1的尾部
l1        
[2, 3, 4, 5, 6]
l2=['甲','乙','丙','丁'] 
l2.insert(2,'戊')     # 在列表l2的第3个位置插入“戊”(插入位置的范围从0到列表的长度)
l2
['甲', '乙', '戊', '丙', '丁']
# 移除列表中特定位置的元素并返回
l2=['甲','乙','丙','丁'] 
l2.pop(2)   # 移除列表l2中第3个位置的元素并返回
l2
['甲', '乙', '丁']
# 连接两个列表
l1 = [2, 3, 4, 5]
l2=['甲','乙','丙','丁']  
l12=l1+l2          # 将列表l1和列表l2连接成一个新列表l12
l12
[2, 3, 4, 5, '甲', '乙', '丙', '丁']
# 列表元素的排序(使用sort函数或sorted函数)
l6 = [2, 3, 4, 5, 2, 8]     # 创建列表l6
l6.sort()   # 默认参数reverse=False,升序排序,设置参数reverse=True,则逆向排序(降序)
l6# 或写成
sorted(l6)
[2, 2, 3, 4, 5, 8]
# 对中文的排序不友好(具体方法见第3章)
l7=['甲', '乙', '戊', '丙', '丁']     # 创建列表l7
sorted(l7)                    # 列表元素的排序,或写成sorted(l7)
['丁', '丙', '乙', '戊', '甲']

【代码框2-3】——创建字典和字典的一些操作

# 用大括号{}创建字典
dc1={'刘文涛':68,'王宇翔':85,'田思雨':74,'徐丽娜':88,'丁文彬':63} # 创建5名学生考试分数的字典
dc1
{'刘文涛': 68, '王宇翔': 85, '田思雨': 74, '徐丽娜': 88, '丁文彬': 63}
# 用dict函数创建字典
dc2=dict(刘文涛=68,王宇翔=85,田思雨=74,徐丽娜=88,丁文彬=63)# 创建5名学生考试分数的字典
dc2
{'刘文涛': 68, '王宇翔': 85, '田思雨': 74, '徐丽娜': 88, '丁文彬': 63}
# 以列表的形式返回字典dc1中的键
dc1.keys()
dict_keys(['刘文涛', '王宇翔', '田思雨', '徐丽娜', '丁文彬'])
# 以列表的形式返回字典dc1中的值
dc1.values()
dict_values([68, 85, 74, 88, 63])
# 以列表的形式返回字典dc1中的键值对
dc1.items()
dict_items([('刘文涛', 68), ('王宇翔', 85), ('田思雨', 74), ('徐丽娜', 88), ('丁文彬', 63)])
# 返回(查询)字典dc1中某个键上的值
dc1['徐丽娜']
88
# 删除字典dc1中的某个键值对
del dc1['田思雨']
dc1
{'刘文涛': 68, '王宇翔': 85, '徐丽娜': 88, '丁文彬': 63}

【代码框2-4】—— 创建集合与集合的一些操作

# 使用set函数创建集合
set1 = set([2,2,2,1,8,3,3,5,5])
set1
{1, 2, 3, 5, 8}
# 使用大括号{}创建集合
set2 = {2,2,2,1,4,3,3,5,6,6}
set2
{1, 2, 3, 4, 5, 6}
# 两个集合的并集(两个集合中不同元素的集合)
set1|set2      # 或写成set1.union(set2)
{1, 2, 3, 4, 5, 6, 8}
# 两个集合的交集(两个集合中相同元素的集合)
set1&set2     # 或写成set1.intersection(set2)
{1, 2, 3, 5}


# 2.2 数组、序列和数据框

【代码框2-5】—— 创建数组和数组的一些操作

# 创建一维数组(向量)
import numpy as np
a1=np.array([5,4,1,2,3])          # 使用array函数创建数组
a2=np.arange(10)                  # 使用range函数生成等差数列,起始为0,步长为1
a3=np.arange(2,6,0.5)             # 使用用arange函数在2~6之间生成步长为0.5的等差序列
print('a1:',a1)                   # 输出结果
print('a2:',a2)
print('a3:',a3) 
a1: [5 4 1 2 3]
a2: [0 1 2 3 4 5 6 7 8 9]
a3: [2.  2.5 3.  3.5 4.  4.5 5.  5.5]
# 使用dtype函数查看数据类型
a1.dtype
dtype('int32')
# 创建二维数组(矩阵)
import numpy as np
a4= np.array([[1, 2], [3, 4], [5, 6]])   # 创建2×3 的矩阵
a4
array([[1, 2],[3, 4],[5, 6]])
# 改变数组的形状
import numpy as np
a5= np.arange(12)               # 创建一维数组
a6=a5.reshape(3,4)              # 改变一维数组为3×4 的二维数组(矩阵)
a6
array([[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11]])
# 数组的其他操作(读者自己运行代码查看结果)
a6.ndim             # 查看数组a6的维度
a6.shape            # 查看数组a6的形状
a6.dtype            # 查看数组a6的数据类型
a6.astype(float)    # 改变数组a6的数据类型为浮点型
a6[2]               # 访问数组a6中的第3个元素(索引从0开始)
a3[5]               # 访问数组a3中的第6个元素(索引从0开始)
a1.sort()           # 对数组a1中的元素排序

注:int表示整数,如int32表示32位整数;int64表示64位整数。

float表示浮点数
如float32(代码:f4或f)表示标准单精度浮点数;
float64(代码:f8或d)表示标准双精度浮点数;
float128(代码:f16或g)表示拓展精度浮点数。

【代码框2-6】—— 用pandas创建序列

import pandas as pd
s1 = pd.Series([2, 3, 4, 5])                    # 省略索引时自动生成索引
s1
0    2
1    3
2    4
3    5
dtype: int64
s2 = pd.Series([5, 8, 7, 6], index=['a', 'b', 'c', 'd'])            # 自行指定索引
s2
a    5
b    8
c    7
d    6
dtype: int64
# 由标量生成序列时,不能省略索引
s3 = pd.Series([60,80,50], index=['甲', 25, True])   # 索引可以是不同类型的元素
s3
甲       60
25      80
True    50
dtype: int64
# 由Python字典生成序列
s4 = pd.Series({'a': 1, 'b': 'boy', 'c': 3})  # 索引与数据以字典形式导入
s4
a      1
b    boy
c      3
dtype: object
# 由其他函数生成序列
s5 = pd.Series(range(5))                 # 使用range函数,类似于列表
print(s5)                                # print函数用于标准输出(也可以直接运行对象s5)
0    0
1    1
2    2
3    3
4    4
dtype: int64

【代码框2-7】—— 序列的基本操作

# 获取序列索引、数据、类型
import pandas as pd
s6 = pd.Series([5, 8, 7, 6], index=['a', 'b', 'c', 'd'])
print('类型:',s6.index)                                 # 获取序列索引
print('数据:',s6.values)                                # 获取序列数据
print('类型:',s6.dtype)                                 # 获取序列类型
类型: Index(['a', 'b', 'c', 'd'], dtype='object')
数据: [5 8 7 6]
类型: int64
# 设置序列与索引的名称(name)属性
s6.name = '我是一个pandas的Series'               # 设置序列名称
s6.index.name = '我是索引'                       # 设置序列索引名称
s6
我是索引
a    5
b    8
c    7
d    6
Name: 我是一个pandas的Series, dtype: int64
# 转换序列类型
s6 = s6.astype(float)                 # 将整数型转换为浮点数类型
s6
我是索引
a    5.0
b    8.0
c    7.0
d    6.0
Name: 我是一个pandas的Series, dtype: float64
# 修改序列中的数据
s6[[1, 3]] = [2, 8]           # 将序列s6中的第2个值和第4个值修改为2和8
s6
C:\Users\VICTUS\AppData\Local\Temp\ipykernel_27584\832664300.py:2: FutureWarning: Series.__setitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To set a value by position, use `ser.iloc[pos] = value`s6[[1, 3]] = [2, 8]           # 将序列s6中的第2个值和第4个值修改为2和8我是索引
a    5.0
b    2.0
c    7.0
d    8.0
Name: 我是一个pandas的Series, dtype: float64
# 序列的对齐运算
s7 = pd.Series([1, 2, 3], index=['a', 'c', 'e'], dtype=float)
s6 + s7                                          # 两个序列相加
a    6.0
b    NaN
c    9.0
d    NaN
e    NaN
dtype: float64
# 序列的一些简单计算
import pandas as pd
s8 = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'], dtype=float)
c=s8.cumsum()  # 求序列s8的累加
s=s8.sum()     # 求序列s8的总和
m=s8.mean()    # 求序列s8的平均数
print("累加:",'\n',c,'\n',"总和 =",s,'\n',"平均数 =",m)
累加: a     1.0
b     3.0
c     6.0
d    10.0
e    15.0
dtype: float64 总和 = 15.0 平均数 = 3.0

【代码框2-8】——使用字典创建数据框

# 使用字典创建数据框(未输入行索引将自动生成,从0开始)
import pandas as pd
d = {"姓名": ["刘文涛","王宇翔","田思雨","徐丽娜","丁文彬"],  # 创建学生姓名列
"统计学": [68, 85, 74, 88, 63],              # 写入统计学分数列
"数学": [85, 91, 74, 100, 82],               # 写入数学分数列
"经济学": [84, 63, 61, 49, 89]}              # 写入经济学分数列
table1_1 = pd.DataFrame(d)                   # 创建数据框并命名为table1_1 
table1_1
姓名统计学数学经济学
0刘文涛688584
1王宇翔859163
2田思雨747461
3徐丽娜8810049
4丁文彬638289

【表2-2】——数据框的操作方法(df=table1_1)

import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")  # 加载数据框table2_1并命名为dfdf.columns     # 查看所有列名(列索引)
df.dtypes      # 查看所有元素的类型
df.head(3)     # 查看前n行数据(默认前5行)
df.index       # 查看数据框的行名(行索引)
df.info        # 查看数据结构(索引、数据类型等)
df.shape       # 查看行数和列数(行,列)
df.T           # 数据框的行列转置
df.tail(3)     # 查看后n行数据(默认后5行)
df.values      # 查看所有元素的值
array([['刘文涛', 68, 85, 84],['王宇翔', 85, 91, 63],['田思雨', 74, 74, 61],['徐丽娜', 88, 100, 49],['丁文彬', 63, 82, 89]], dtype=object)

【代码框2-9】——数据框的常用操作(df=table1_1)

import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")# 选择指定的列
df[['数学']]             # 选择数学列
数学
085
191
274
3100
482
df[['数学','统计学']]    # 选择数学和统计学两列
数学统计学
08568
19185
27474
310088
48263
# 选择指定的行
df.loc[2]                # 选择第3行数据,或写成df.iloc[2]
姓名     田思雨
统计学     74
数学      74
经济学     61
Name: 2, dtype: object
df.loc[[2,4]]            # 选择第3~5行数据,或写成df.iloc[[2,4]]
姓名统计学数学经济学
2田思雨747461
4丁文彬638289
df.loc[2:4]            # 连续选择第3行到第5行数据,或写成df[2:]
姓名统计学数学经济学
2田思雨747461
3徐丽娜8810049
4丁文彬638289
# 同时选择多行和多列
dd=df.iloc[[1,3],[0,2,3]]  # 选择第2、4行和第1、3、4列# 或写成
dd=df.loc[[1,3],['姓名','数学','经济学']]  # 获取第2、4行和第1、3、4列 # 不能使用:连选 
dd
姓名数学经济学
1王宇翔9163
3徐丽娜10049
# 使用:(切片符号)进行数据切片
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")
df[:]             # 选择所有行,或写成df.loc[:]  
姓名统计学数学经济学
0刘文涛688584
1王宇翔859163
2田思雨747461
3徐丽娜8810049
4丁文彬638289
df[2:]    # 选择第2行(不含第2行)后的所有行
姓名统计学数学经济学
2田思雨747461
3徐丽娜8810049
4丁文彬638289
df[:2]            # 选择第2行(含第2行)前的所有行
姓名统计学数学经济学
0刘文涛688584
1王宇翔859163
df[::2]   # 每隔1行取1行
姓名统计学数学经济学
0刘文涛738584
2田思雨797461
4丁文彬688289

# 增加列
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")df['会计学']=[88,75,92,67,78]     # 在数据框的最后插入1列会计学分数,或写成df.loc[:,'会计学']=[88,75,92,67,78]
df
姓名统计学数学经济学会计学
0刘文涛68858488
1王宇翔85916375
2田思雨74746192
3徐丽娜881004967
4丁文彬63828978
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")
df.insert(2,'会计学',[88,75,92,67,78]) # 在第2列后面插入1列会计学分数
df
姓名统计学会计学数学经济学
0刘文涛68888584
1王宇翔85759163
2田思雨74927461
3徐丽娜886710049
4丁文彬63788289
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")# 删除数据
df.drop(['数学'],axis=1,inplace=True)  # 删除指定的列,或写成df.drop(labels='数学',axis=1,inplace=True)
df
姓名统计学经济学
0刘文涛6884
1王宇翔8563
2田思雨7461
3徐丽娜8849
4丁文彬6389
df.drop(index=2,inplace=True)   # 删除第3行数据
df
姓名统计学经济学
0刘文涛6884
1王宇翔8563
3徐丽娜8849
4丁文彬6389
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/table2_1.csv")# 修改列名称
df.rename(columns={'数学':'计算机','经济学':'管理学'}) # 将“数学”修改为“计算机”,将“经济学”修改为“管理学”
姓名统计学计算机管理学
0刘文涛688584
1王宇翔859163
2田思雨747461
3徐丽娜8810049
4丁文彬638289
# 修改数据
df.iloc[2,1]=85   # 修改第3行(索引2)田思雨的统计学成绩为85
df
姓名统计学数学经济学
0刘文涛688584
1王宇翔859163
2田思雨857461
3徐丽娜8810049
4丁文彬638289
df.loc[:,'统计学']=[73,90,79,88,68]   # 修改所有学生的统计学成绩为[73,90,79,88,68]
df
姓名统计学数学经济学
0刘文涛738584
1王宇翔909163
2田思雨797461
3徐丽娜8810049
4丁文彬688289

【代码框2-10】——数据框排序

import pandas as pd
table2_1 = pd.read_csv("./pydata/example/chap02/table2_1.csv")  # 加载数据框# 按姓名笔画升序排序数据框
my_type=pd.CategoricalDtype(categories=['丁文彬','王宇翔','田思雨','刘文涛','徐丽娜'],ordered=True)          # 设置类别顺序
table2_1['姓名']=table2_1['姓名'].astype(my_type)  # 转换数据框的性别为有序类
table2_1.sort_values(by='姓名', ascending=True)    # 按姓名笔画升序排序数据框
姓名统计学数学经济学
4丁文彬638289
1王宇翔859163
2田思雨747461
0刘文涛688584
3徐丽娜8810049
# 按条件下分数降序排序数据框
import pandas as pd
table2_1 = pd.read_csv("./pydata/example/chap02/table2_1.csv")  # 加载数据框table2_1.sort_values(by='统计学',ascending=False)   # 按统计学分数降序对整个数据框排序
姓名统计学数学经济学
3徐丽娜8810049
1王宇翔859163
2田思雨747461
0刘文涛688584
4丁文彬638289

【代码框2-11】——数据框合并

# 按行合并数据框
import pandas as pd
table2_1 = pd.read_csv("./pydata/example/chap02/table2_1.csv")                  
table2_3 = pd.read_csv("./pydata/example/chap02/table2_3.csv")mytable = pd.concat([table2_1, table2_3]).reset_index(drop=True)
mytable
姓名统计学数学经济学
0刘文涛688584
1王宇翔859163
2田思雨747461
3徐丽娜8810049
4丁文彬638289
5李志国788451
6王智强907859
7宋丽媛8010053
8袁芳芳585179
9张建国637091
mytable.max()
姓名     袁芳芳
统计学     90
数学     100
经济学     91
dtype: object

【表2-4】——数据框应用的一些主要函数(以table2_1为例)

import pandas as pd
table2_1 = pd.read_csv("./pydata/example/chap02/table2_1.csv") 
df=table2_1df.describe()  # 输出数据框的主要描述统计量
df.count()     # 返回每一列中非空值的个数
df.sum()       # 返回每一列的和(无法计算时返回空值)
df.max()       # 返回每一列的最大值
df.min()       # 返回每一列的最小值
# df.argmax()    # 返回最大值所在的自动索引位置
# df.argmin()    # 返回最小值所在的自动索引位置
# df.idxmax()    # 返回最大值所在的自定义索引位置
# df.idxmin()    # 返回最小值所在的自定义索引位置#删去非数值列
df.drop(['姓名'],axis=1).describe()  # 删除姓名列后的描述统计量
df=df.drop(['姓名'],axis=1)          # 删除姓名列
df.mean()      # 返回每一列的平均值
df.median()    # 返回每一列的中位数
df.var()       # 返回每一列的方差
df.std()       # 返回每一列的标准差
统计学    10.737784
数学      9.762172
经济学    16.769019
dtype: float64


# 2.3 数据抽样和筛选

【例2-1】——数据抽样

【代码框2-12】——抽取简单随机样本

import pandas as pd
import random
example2_1 = pd.read_csv("./pydata/example/chap02/example2_1.csv")  # 随机抽取10名学生组成一个样本
d1=example2_1['姓名']
n1 = random.sample(population=list(d1), k=10)   # 无放回抽取10个数据,k为抽样次数
n2 = random.choices(population=d1, k=10)        # 有放回抽取10个数据# 随机抽取10个考试分数组成一个样本
d2=example2_1['考试分数']
n3 = random.sample(population=list(d2), k=10)   # 无放回抽取10个数据,k为抽样次数
n4 = random.choices(population=d2, k=10)        # 有放回抽取10个数据# 打印结果
print('# 无放回抽取10名学生:','\n',n1,'\n''# 有放回抽取10名学生:','\n',n2,'\n''# 无放回抽取10个考试分数:','\n',n3,'\n''# 有放回抽取10个考试分数:','\n',n4)# 打印结果
# 无放回抽取10名学生: ['张志杰', '宋丽媛', '李佳佳', '黄向春', '金梦迪', '邱怡爽', '张青松', '王雯迪', '孟子铎', '唐国健'] 
# 有放回抽取10名学生: ['吴凯迪', '崔志勇', '袁芳芳', '徐丽娜', '金梦迪', '刘晓军', '马家强', '张青松', '王晓倩', '卢春阳'] 
# 无放回抽取10个考试分数: [73, 97, 75, 74, 89, 79, 91, 77, 76, 74] 
# 有放回抽取10个考试分数: [82, 77, 77, 71, 77, 75, 71, 80, 71, 89]

【代码框2-13】——数据筛选

import pandas as pd
df = pd.read_csv("./pydata/example/chap02/example2_1.csv") # 筛选出考试分数小于60的所有学生
df[df['考试分数']<60]
姓名性别专业满意度考试分数
11马凤良金融学满意55
14孙学伟会计学不满意51
33张天洋会计学一般56
# 筛选出考试分数为70、80和90的3名学生
df.loc[df['考试分数'].isin([70,80,90]),:].sample(3) 
姓名性别专业满意度考试分数
49王思思会计学满意80
47尹嘉韩会计学一般70
21李国胜金融学一般90
# 筛选出不满意的所有学生
df[df['满意度']=='不满意'].head(3)  # 只显示前3行
姓名性别专业满意度考试分数
0张青松会计学不满意82
4张志杰会计学不满意77
10李佳佳金融学不满意80
# 筛选出管理学专业满意的学生
df[(df['专业'] =='管理学') & (df['满意度'] =='满意')]
姓名性别专业满意度考试分数
18吴凯迪管理学满意71
36李宗洋管理学满意79
37刘皓天管理学满意85
41孟子铎管理学满意82
46唐国健管理学满意75
# 筛选出会计学专业考试分数大于等于80的女生,并按分数多少降序排序
df[(df['专业'] =='会计学') & (df['考试分数']>=80) & (df['性别'] =='女')].sort_values(by='考试分数',ascending=False)
姓名性别专业满意度考试分数
29李爱华会计学不满意98
7宋丽媛会计学一般92
34李冬茗会计学满意88
35王晓倩会计学不满意86
49王思思会计学满意80
# 筛选出考试分数大于等于80、金融学专业满意的女生,并按分数多少降序排列
df[(df['考试分数']>=80) & (df['专业'] =='金融学') & (df['满意度'] =='满意')& (df['性别'] =='女') ].sort_values(by='考试分数',ascending=False)
姓名性别专业满意度考试分数
5赵颖颖金融学满意97
26丁丽佳金融学满意89
28于文静金融学满意84
43邱怡爽金融学满意83

【代码框2-14】——生成随机数

# 生成不同分布的随机数(每种分布生成5个)
import numpy.random as nprnpr.seed(15)                              # 设定随机数种子
r1=npr.standard_normal(size=5)            # 标准正态分布
r2=npr.normal(loc=50,scale=5,size=5)      # 均值(loc)为50、标准差(scale)为5的正态分布
r3=npr.uniform(low=0, high=10, size=5)    # 0~10之间的均匀分布print('# 标准正态分布:','\n',r1,'\n''# 值为50、标准差为5的正态分布:','\n',r2,'\n''# 0~10之间的均匀分布:','\n',r3)  # 打印结果
# 标准正态分布: [-0.31232848  0.33928471 -0.15590853 -0.50178967  0.23556889] 
# 值为50、标准差为5的正态分布: [41.18197372 44.52068978 44.56117129 48.47414974 47.63125814] 
# 0~10之间的均匀分布: [9.17629898 2.64146853 7.17773687 8.65715034 8.07079482]

# 2.4 生成频数表

【例2-2】——类别数据频数分布表

【代码框2-15】—生成一维表

# 使用value.counts()函数生成专业的简单频数表
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/example2_1.csv")tab11=df['专业'].value_counts()     # 生成频数表(类型是序列)
pd.DataFrame(tab11)                 # 转换成数据框
count
专业
会计学19
金融学16
管理学15
# 将频数表转化成百分比表
tab12=pd.DataFrame(df['专业'].value_counts(normalize=True)*100)
tab12
proportion
专业
会计学38.0
金融学32.0
管理学30.0

【代码框2-16】—生成二维表

# 使用pd中的crosstab函数生成二维表
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/example2_1.csv")
tab21=pd.crosstab(df.性别,df.满意度)
tab21
满意度一般不满意满意
性别
3613
12610
# 为二维表添加边际和并修改边际和的名称
tab22=pd.crosstab(df.性别,df.满意度,margins=True,margins_name='合计')
tab22 
满意度一般不满意满意合计
性别
361322
1261028
合计15122350
# 将二维表转换成百分比表
tab23=pd.crosstab(df.性别,df.满意度,margins=True,margins_name='合计',normalize='index')
round(tab23*100,2)     # 转换成百分比表,结果保留2位小数     
满意度一般不满意满意
性别
13.6427.2759.09
42.8621.4335.71
合计30.0024.0046.00
# 计算各列所占的比例,并转换成百分比表
tab24=pd.crosstab(df.性别,df.满意度,margins=True,margins_name='合计',normalize='columns')
round(tab24*100,2)
满意度一般不满意满意合计
性别
20.050.056.5244.0
80.050.043.4856.0
# 计算各数据占总和的比例,并转换成百分比表
tab25=pd.crosstab(df.性别,df.满意度,margins=True,margins_name='合计',normalize='all')
tab25*100
满意度一般不满意满意合计
性别
6.012.026.044.0
24.012.020.056.0
合计30.024.046.0100.0

【代码框2-17】—生成多维表

# 性别和专业为行变量,满意度为列变量(行变量和列变量根据需要确定)
import pandas as pd
import numpy as np
df = pd.read_csv("./pydata/example/chap02/example2_1.csv")df.drop(['姓名','考试分数'],axis=1,inplace=True)  # 删除姓名列和考试分数列
tab1 = pd.pivot_table(df,index=['性别','专业'],   # 设置行变量columns=['满意度'],                  # 设置列变量margins=True, margins_name='合计',   # 添加边际和并重命名为“合计”aggfunc=len)                         # 使用长度聚集函数
tab1
满意度一般不满意满意合计
性别专业
会计学1359
管理学1214
金融学1179
会计学43310
管理学52411
金融学3137
合计15122350
# 满意度为行变量,性别和专业为列变量
tab2 = pd.pivot_table(df,index=['满意度'],columns=['性别','专业'],margins=True, margins_name='合计',aggfunc=len)
tab2
性别合计
专业会计学管理学金融学会计学管理学金融学
满意度
一般11145315
不满意32132112
满意51734323
合计9491011750

【例2-3】——数值数据频数分布表——将分组转换成数据框,再加标签

【代码框2-18】—数值数据分组表

import pandas as pd
df = pd.read_csv("./pydata/example/chap02/example2_3.csv")# 组距=10的分组
f=pd.cut(df['销售额'],bins=[160,170,180,190,200,210,220,230,240,250,260,270,280],right=True)           # 默认,含上限值
tf=f.value_counts()            # 生成频数表
tab=tf.sort_index()            # 按索引排序(函数默认按数据即频数排序)# 修改tab的输出格式并添加其他信息
df=pd.concat({"频数": tab},axis=1)    # 构建数据框
df.loc[:,'频数百分比 (%)']=df['频数']/sum(df['频数'])*100  # 插入频数百分比
df.loc[:,'累积频数']=df['频数'].cumsum()   # 插入累积频数
df.loc[:,'累积频数百分比 (%)']=(df['频数'].cumsum()/df['频数'].sum())*100 # 插入累积频数百分比
df.index.name = '销售额分组'    # 设置索引名称round(df,2)    # 保留2位小数
频数频数百分比 (%)累积频数累积频数百分比 (%)
销售额分组
(160, 170]21.6721.67
(170, 180]43.3365.00
(180, 190]75.831310.83
(190, 200]2117.503428.33
(200, 210]2520.835949.17
(210, 220]1915.837865.00
(220, 230]1613.339478.33
(230, 240]1310.8310789.17
(240, 250]65.0011394.17
(250, 260]43.3311797.50
(260, 270]21.6711999.17
(270, 280]10.83120100.00
import pandas as pd
df = pd.read_csv("./pydata/example/chap02/example2_3.csv")# 组距为15的分组
f=pd.cut(df['销售额'],bins=[160,175,190,205,220,235,250,265,280],right=False)          # 不含上限值
tf=f.value_counts()            # 生成频数表
tab=tf.sort_index()            # 按索引排序(函数默认按数据即频数排序)# 修改tab的输出格式并添加其他信息
df=pd.concat({"频数": tab},axis=1)    # 构建数据框df.loc[:,'频数百分比 (%)']=df['频数']/sum(df['频数'])*100  # 插入频数百分比
df.loc[:,'累积频数']=df['频数'].cumsum()   # 插入累积频数
df.loc[:,'累积频数百分比 (%)']=(df['频数'].cumsum()/df['频数'].sum())*100 # 插入累积频数百分比
df.index.name = '销售额分组'              # 设置索引名称round(df,2)
频数频数百分比 (%)累积频数累积频数百分比 (%)
销售额分组
[160, 175)65.0065.00
[175, 190)75.831310.83
[190, 205)3025.004335.83
[205, 220)3428.337764.17
[220, 235)2117.509881.67
[235, 250)1512.5011394.17
[250, 265)54.1711898.33
[265, 280)21.67120100.00

http://www.mrgr.cn/news/69347.html

相关文章:

  • python习题练习
  • vue项目PC端和移动端实现在线预览docx、excel、pdf文件
  • Ubuntu 18 EDK2 环境编译
  • 纽约大学:指导LLM提出澄清性问题
  • 使用HAMi 进行gpu虚拟化
  • 【网络安全】OSI网络安全体系结构
  • 职场中如何向下属表达自己的观点
  • 华为私有接口类型hybrid
  • 医学可视化之热力图
  • C++接口类, 抽象类和实体类简述
  • 【C++】详解RAII思想与智能指针
  • 基于大语言模型的规划
  • 网站开发-苍穹外卖-day3:苍穹外卖和瑞吉外卖哪个更好???
  • UE5 HLSL 学习笔记
  • 111 - Lecture 8
  • 【MySQL场景题:如何保障传入id顺序与查询结果id顺序一致】---项目积累
  • A20红色革命文物征集管理系统
  • 【核心变量】上市公司企业战略激进度数据 (2004-2023年)
  • libaom 源码分析:重叠块运动补偿OBMC
  • 农业产业链大延伸,农业强国梦正圆!
  • 线性表(顺序表和链表)
  • 负载均衡算法常见实现
  • 【韩老师零基础30天学会Java 】03章 变量
  • pyspark入门基础详细讲解
  • 暮雨直播 1.3.2 | 内置直播源,频道丰富,永久免费
  • 玩的花,云产品也能拼团了!!!