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.xdnf.cn/news/9717.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

推荐一款国产数据库管理工具Chat2DB

什么是 Chat2DB ? Chat2DB 是一款专为现代数据驱动型企业打造的数据库管理、数据开发及数据分析工具。作为一款AI原生的产品&#xff0c;Chat2DB 将人工智能技术与传统数据库管理功能深度融合&#xff0c;旨在提供更为智能、便捷的工作体验&#xff0c;助力用户高效地管理数据…

前端三件套(HTML + CSS + JS)

前言&#xff1a; 前端三件套&#xff0c;会用就行 毕竟在后面学习JavaWeb&#xff0c;以及在学习vue的时候也有帮助 前端三件套&#xff1a; HTML 定义网页的结构和内容。CSS 负责网页的样式和布局。JavaScript 添加动态交互和功能。 使用到的工具是Visual Studio Code 即…

Flutter错误: uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared

前言 今天要做蓝牙通信的功能&#xff0c;我使用了flutter_reactive_ble这个库&#xff0c;但是在运行的时候发现一下错误 Launching lib/main.dart on AQM AL10 in debug mode... /Users/macbook/Desktop/test/flutter/my_app/android/app/src/debug/AndroidManifest.xml Err…

网络编程示例之网络基础知识

TCP/IP 中有两个具有代表性的传输层协议&#xff0c;分别是 TCP 和 UDP&#xff1a; TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构&#xff0c;当应用程序采用 TCP 发送消息时&#xff0c;虽然可以保证发送的顺序&#xff0c;但还是犹如没有任何间隔的数据流发送…

十七:Spring Boot 依赖(2)-- spring-boot-starter-data-jpa 依赖详解

目录 1. 理解 JPA&#xff08;Java Persistence API&#xff09; 1.1 什么是 JPA&#xff1f; 1.2 JPA 与 Hibernate 的关系 1.3 JPA 的基本注解&#xff1a;Entity, Table, Id, GeneratedValue 1.4 JPA 与数据库表的映射 2. Spring Data JPA 概述 2.1 什么是 Spring Dat…

商品,订单业务流程梳理一

业务架构梳理 业务系统介绍 业务商品流程 业务订单流程 业务售后流程 系统架构 技术栈

HDR视频技术之二:光电转换与 HDR 图像显示

将自然界中的真实场景转换为屏幕上显示出来的图像&#xff0c;往往需要经过两个主要的步骤&#xff1a;第一个是通过摄影设备&#xff0c;将外界的光信息转换为图像信息存储起来&#xff0c;本质上是存储为数字信号&#xff1b;第二个是通过显示设备&#xff0c;将图像信息转换…

Linux完结

学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 【linux基础之病毒编写&#xff08;完结&#xff09;】 https://www.bilibili.com/video…

苹果iOS 18.4将允许欧盟地区的iPhone用户设置默认地图和翻译应用

在一份最新文件中&#xff0c;苹果概述了其为遵守欧盟数字市场法案所采取的措施&#xff0c;并透露将允许欧盟的 iPhone 和 iPad 用户从"2025 年春季"开始设置默认导航和翻译应用程序。 这一时间表表明&#xff0c;这些选项将在 iOS 18.4 和 iPadOS 18.4 中添加&…

鸿蒙进阶篇-type、typeof、类

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

鸿蒙进阶篇-剩余和展开、简单和复杂类型

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

爬虫学习4

from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(targetfunc,args("1"))t2 Thread(targetfunc, args("2"))t1.start()t2.start()print("我是诛仙剑")from …

【LeetCode:3242. 设计相邻元素求和服务 + 模拟 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

[产品管理-62]:不同角度看产品的生命周期

目录 一、产品的生命周期与不确定性 创意生成 原型开发 规模化和商业化 - 上市前的准备 产品上市 二、产品的生命周期与组合管理 三、产品生命周期变得越来越短的原因 1. 科技进步 2. 消费需求变化 》 物质需求的单一化到精神需求的易变化 3. 市场竞争加剧 4. 全球化…

WPS单元格重复值提示设置

选中要检查的所有的单元格 设置提示效果 当出现单元格值重复时&#xff0c;重复的单元格就会自动变化 要修改或删除&#xff0c;点击

华为eNSP:AAA认证(pap和chap)telnet/ssh

pap模式 一、拓扑图 二、配置过程 1、这个型号路由器是不带串口的&#xff0c;所以需要添加串口板卡 2、加入串行接口卡槽 右击路由&#xff0c;选择设置&#xff0c;将串口板卡拖动到路由器扩展槽&#xff0c;并开机即可 3、认证方路由器配置 [r8]aaa #进入aaa认证 [r8-a…

CSS网格布局:打造现代网页设计的强大工具

在现代网页设计中&#xff0c;布局的灵活性和美观性至关重要。随着需求的不断变化&#xff0c;CSS 网格布局&#xff08;CSS Grid Layout&#xff09;作为一种新兴的布局方式&#xff0c;正在成为开发者们的首选工具。它能够轻松创建复杂的网格结构&#xff0c;使得网页设计更加…

SpringBoot助力的共享汽车业务优化系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

算法 -插入排序

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【算法】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;插入排序1. ➡️ 直接插入排序&#x1f5bc;️示意图&#x1f4d6;简介&#x1f4a1;实现思路&#x1f4bb;代码实现&#x1f4dd;具体示例 2. ⬆️…

2025中国(郑州)国际台球产业博览会(壹肆柒·台球展)3月

随着体育经济的迅猛发展&#xff0c;台球作为一项受欢迎的竞技运动&#xff0c;近年来在中国逐渐崭露头角。为促进台球产业的发展&#xff0c;推动各类相关产品及服务的交流与合作&#xff0c;从而实现共享共赢&#xff0c;2025年中国&#xff08;郑州&#xff09;国际台球产业…