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 ) )
l4
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l5= list ( range ( 100 , 200 , 20 ) )
l5
[100, 120, 140, 160, 180]
【代码框2-2】——列表的几种不同操作
l1 = [ 2 , 3 , 4 , 5 ]
l1. append( 6 )
l1
[2, 3, 4, 5, 6]
l2= [ '甲' , '乙' , '丙' , '丁' ]
l2. insert( 2 , '戊' )
l2
['甲', '乙', '戊', '丙', '丁']
l2= [ '甲' , '乙' , '丙' , '丁' ]
l2. pop( 2 )
l2
['甲', '乙', '丁']
l1 = [ 2 , 3 , 4 , 5 ]
l2= [ '甲' , '乙' , '丙' , '丁' ]
l12= l1+ l2
l12
[2, 3, 4, 5, '甲', '乙', '丙', '丁']
l6 = [ 2 , 3 , 4 , 5 , 2 , 8 ]
l6. sort( )
l6
sorted ( l6)
[2, 2, 3, 4, 5, 8]
l7= [ '甲' , '乙' , '戊' , '丙' , '丁' ]
sorted ( l7)
['丁', '丙', '乙', '戊', '甲']
【代码框2-3】——创建字典和字典的一些操作
dc1= { '刘文涛' : 68 , '王宇翔' : 85 , '田思雨' : 74 , '徐丽娜' : 88 , '丁文彬' : 63 }
dc1
{'刘文涛': 68, '王宇翔': 85, '田思雨': 74, '徐丽娜': 88, '丁文彬': 63}
dc2= dict ( 刘文涛= 68 , 王宇翔= 85 , 田思雨= 74 , 徐丽娜= 88 , 丁文彬= 63 )
dc2
{'刘文涛': 68, '王宇翔': 85, '田思雨': 74, '徐丽娜': 88, '丁文彬': 63}
dc1. keys( )
dict_keys(['刘文涛', '王宇翔', '田思雨', '徐丽娜', '丁文彬'])
dc1. values( )
dict_values([68, 85, 74, 88, 63])
dc1. items( )
dict_items([('刘文涛', 68), ('王宇翔', 85), ('田思雨', 74), ('徐丽娜', 88), ('丁文彬', 63)])
dc1[ '徐丽娜' ]
88
del dc1[ '田思雨' ]
dc1
{'刘文涛': 68, '王宇翔': 85, '徐丽娜': 88, '丁文彬': 63}
【代码框2-4】—— 创建集合与集合的一些操作
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
{1, 2, 3, 4, 5, 6, 8}
set1& set2
{1, 2, 3, 5}
# 2.2 数组、序列和数据框
【代码框2-5】—— 创建数组和数组的一些操作
import numpy as np
a1= np. array( [ 5 , 4 , 1 , 2 , 3 ] )
a2= np. arange( 10 )
a3= np. 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]
a1. dtype
dtype('int32')
import numpy as np
a4= np. array( [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] )
a4
array([[1, 2],[3, 4],[5, 6]])
import numpy as np
a5= np. arange( 12 )
a6= a5. reshape( 3 , 4 )
a6
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
a6. ndim
a6. shape
a6. dtype
a6. astype( float )
a6[ 2 ]
a3[ 5 ]
a1. sort( )
注: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
s4 = pd. Series( { 'a' : 1 , 'b' : 'boy' , 'c' : 3 } )
s4
a 1
b boy
c 3
dtype: object
s5 = pd. Series( range ( 5 ) )
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
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
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( )
s= s8. sum ( )
m= s8. mean( )
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】——使用字典创建数据框
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
姓名 统计学 数学 经济学 0 刘文涛 68 85 84 1 王宇翔 85 91 63 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
【表2-2】——数据框的操作方法(df=table1_1)
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" ) df. columns
df. dtypes
df. head( 3 )
df. index
df. info
df. shape
df. T
df. tail( 3 )
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[ [ '数学' ] ]
df[ [ '数学' , '统计学' ] ]
数学 统计学 0 85 68 1 91 85 2 74 74 3 100 88 4 82 63
df. loc[ 2 ]
姓名 田思雨
统计学 74
数学 74
经济学 61
Name: 2, dtype: object
df. loc[ [ 2 , 4 ] ]
姓名 统计学 数学 经济学 2 田思雨 74 74 61 4 丁文彬 63 82 89
df. loc[ 2 : 4 ]
姓名 统计学 数学 经济学 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
dd= df. iloc[ [ 1 , 3 ] , [ 0 , 2 , 3 ] ]
dd= df. loc[ [ 1 , 3 ] , [ '姓名' , '数学' , '经济学' ] ]
dd
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" )
df[ : ]
姓名 统计学 数学 经济学 0 刘文涛 68 85 84 1 王宇翔 85 91 63 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
df[ 2 : ]
姓名 统计学 数学 经济学 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
df[ : 2 ]
姓名 统计学 数学 经济学 0 刘文涛 68 85 84 1 王宇翔 85 91 63
df[ : : 2 ]
姓名 统计学 数学 经济学 0 刘文涛 73 85 84 2 田思雨 79 74 61 4 丁文彬 68 82 89
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" ) df[ '会计学' ] = [ 88 , 75 , 92 , 67 , 78 ]
df
姓名 统计学 数学 经济学 会计学 0 刘文涛 68 85 84 88 1 王宇翔 85 91 63 75 2 田思雨 74 74 61 92 3 徐丽娜 88 100 49 67 4 丁文彬 63 82 89 78
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" )
df. insert( 2 , '会计学' , [ 88 , 75 , 92 , 67 , 78 ] )
df
姓名 统计学 会计学 数学 经济学 0 刘文涛 68 88 85 84 1 王宇翔 85 75 91 63 2 田思雨 74 92 74 61 3 徐丽娜 88 67 100 49 4 丁文彬 63 78 82 89
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" )
df. drop( [ '数学' ] , axis= 1 , inplace= True )
df
姓名 统计学 经济学 0 刘文涛 68 84 1 王宇翔 85 63 2 田思雨 74 61 3 徐丽娜 88 49 4 丁文彬 63 89
df. drop( index= 2 , inplace= True )
df
姓名 统计学 经济学 0 刘文涛 68 84 1 王宇翔 85 63 3 徐丽娜 88 49 4 丁文彬 63 89
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/table2_1.csv" )
df. rename( columns= { '数学' : '计算机' , '经济学' : '管理学' } )
姓名 统计学 计算机 管理学 0 刘文涛 68 85 84 1 王宇翔 85 91 63 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
df. iloc[ 2 , 1 ] = 85
df
姓名 统计学 数学 经济学 0 刘文涛 68 85 84 1 王宇翔 85 91 63 2 田思雨 85 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89
df. loc[ : , '统计学' ] = [ 73 , 90 , 79 , 88 , 68 ]
df
姓名 统计学 数学 经济学 0 刘文涛 73 85 84 1 王宇翔 90 91 63 2 田思雨 79 74 61 3 徐丽娜 88 100 49 4 丁文彬 68 82 89
【代码框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 丁文彬 63 82 89 1 王宇翔 85 91 63 2 田思雨 74 74 61 0 刘文涛 68 85 84 3 徐丽娜 88 100 49
import pandas as pd
table2_1 = pd. read_csv( "./pydata/example/chap02/table2_1.csv" ) table2_1. sort_values( by= '统计学' , ascending= False )
姓名 统计学 数学 经济学 3 徐丽娜 88 100 49 1 王宇翔 85 91 63 2 田思雨 74 74 61 0 刘文涛 68 85 84 4 丁文彬 63 82 89
【代码框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 刘文涛 68 85 84 1 王宇翔 85 91 63 2 田思雨 74 74 61 3 徐丽娜 88 100 49 4 丁文彬 63 82 89 5 李志国 78 84 51 6 王智强 90 78 59 7 宋丽媛 80 100 53 8 袁芳芳 58 51 79 9 张建国 63 70 91
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. 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" )
d1= example2_1[ '姓名' ]
n1 = random. sample( population= list ( d1) , k= 10 )
n2 = random. choices( population= d1, k= 10 )
d2= example2_1[ '考试分数' ]
n3 = random. sample( population= list ( d2) , k= 10 )
n4 = random. choices( population= d2, k= 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" )
df[ df[ '考试分数' ] < 60 ]
姓名 性别 专业 满意度 考试分数 11 马凤良 男 金融学 满意 55 14 孙学伟 男 会计学 不满意 51 33 张天洋 男 会计学 一般 56
df. loc[ df[ '考试分数' ] . isin( [ 70 , 80 , 90 ] ) , : ] . sample( 3 )
姓名 性别 专业 满意度 考试分数 49 王思思 女 会计学 满意 80 47 尹嘉韩 男 会计学 一般 70 21 李国胜 男 金融学 一般 90
df[ df[ '满意度' ] == '不满意' ] . head( 3 )
姓名 性别 专业 满意度 考试分数 0 张青松 男 会计学 不满意 82 4 张志杰 男 会计学 不满意 77 10 李佳佳 女 金融学 不满意 80
df[ ( df[ '专业' ] == '管理学' ) & ( df[ '满意度' ] == '满意' ) ]
姓名 性别 专业 满意度 考试分数 18 吴凯迪 女 管理学 满意 71 36 李宗洋 男 管理学 满意 79 37 刘皓天 男 管理学 满意 85 41 孟子铎 男 管理学 满意 82 46 唐国健 男 管理学 满意 75
df[ ( df[ '专业' ] == '会计学' ) & ( df[ '考试分数' ] >= 80 ) & ( df[ '性别' ] == '女' ) ] . sort_values( by= '考试分数' , ascending= False )
姓名 性别 专业 满意度 考试分数 29 李爱华 女 会计学 不满意 98 7 宋丽媛 女 会计学 一般 92 34 李冬茗 女 会计学 满意 88 35 王晓倩 女 会计学 不满意 86 49 王思思 女 会计学 满意 80
df[ ( df[ '考试分数' ] >= 80 ) & ( df[ '专业' ] == '金融学' ) & ( df[ '满意度' ] == '满意' ) & ( df[ '性别' ] == '女' ) ] . sort_values( by= '考试分数' , ascending= False )
姓名 性别 专业 满意度 考试分数 5 赵颖颖 女 金融学 满意 97 26 丁丽佳 女 金融学 满意 89 28 于文静 女 金融学 满意 84 43 邱怡爽 女 金融学 满意 83
【代码框2-14】——生成随机数
import numpy. random as nprnpr. seed( 15 )
r1= npr. standard_normal( size= 5 )
r2= npr. normal( loc= 50 , scale= 5 , size= 5 )
r3= npr. uniform( low= 0 , high= 10 , size= 5 ) 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】—生成一维表
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/example2_1.csv" ) tab11= df[ '专业' ] . value_counts( )
pd. DataFrame( tab11)
tab12= pd. DataFrame( df[ '专业' ] . value_counts( normalize= True ) * 100 )
tab12
proportion 专业 会计学 38.0 金融学 32.0 管理学 30.0
【代码框2-16】—生成二维表
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/example2_1.csv" )
tab21= pd. crosstab( df. 性别, df. 满意度)
tab21
tab22= pd. crosstab( df. 性别, df. 满意度, margins= True , margins_name= '合计' )
tab22
满意度 一般 不满意 满意 合计 性别 女 3 6 13 22 男 12 6 10 28 合计 15 12 23 50
tab23= pd. crosstab( df. 性别, df. 满意度, margins= True , margins_name= '合计' , normalize= 'index' )
round ( tab23* 100 , 2 )
满意度 一般 不满意 满意 性别 女 13.64 27.27 59.09 男 42.86 21.43 35.71 合计 30.00 24.00 46.00
tab24= pd. crosstab( df. 性别, df. 满意度, margins= True , margins_name= '合计' , normalize= 'columns' )
round ( tab24* 100 , 2 )
满意度 一般 不满意 满意 合计 性别 女 20.0 50.0 56.52 44.0 男 80.0 50.0 43.48 56.0
tab25= pd. crosstab( df. 性别, df. 满意度, margins= True , margins_name= '合计' , normalize= 'all' )
tab25* 100
满意度 一般 不满意 满意 合计 性别 女 6.0 12.0 26.0 44.0 男 24.0 12.0 20.0 56.0 合计 30.0 24.0 46.0 100.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
满意度 一般 不满意 满意 合计 性别 专业 女 会计学 1 3 5 9 管理学 1 2 1 4 金融学 1 1 7 9 男 会计学 4 3 3 10 管理学 5 2 4 11 金融学 3 1 3 7 合计 15 12 23 50
tab2 = pd. pivot_table( df, index= [ '满意度' ] , columns= [ '性别' , '专业' ] , margins= True , margins_name= '合计' , aggfunc= len )
tab2
性别 女 男 合计 专业 会计学 管理学 金融学 会计学 管理学 金融学 满意度 一般 1 1 1 4 5 3 15 不满意 3 2 1 3 2 1 12 满意 5 1 7 3 4 3 23 合计 9 4 9 10 11 7 50
【例2-3】——数值数据频数分布表——将分组转换成数据框,再加标签
【代码框2-18】—数值数据分组表
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/example2_3.csv" )
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( )
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, 170] 2 1.67 2 1.67 (170, 180] 4 3.33 6 5.00 (180, 190] 7 5.83 13 10.83 (190, 200] 21 17.50 34 28.33 (200, 210] 25 20.83 59 49.17 (210, 220] 19 15.83 78 65.00 (220, 230] 16 13.33 94 78.33 (230, 240] 13 10.83 107 89.17 (240, 250] 6 5.00 113 94.17 (250, 260] 4 3.33 117 97.50 (260, 270] 2 1.67 119 99.17 (270, 280] 1 0.83 120 100.00
import pandas as pd
df = pd. read_csv( "./pydata/example/chap02/example2_3.csv" )
f= pd. cut( df[ '销售额' ] , bins= [ 160 , 175 , 190 , 205 , 220 , 235 , 250 , 265 , 280 ] , right= False )
tf= f. value_counts( )
tab= tf. sort_index( )
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) 6 5.00 6 5.00 [175, 190) 7 5.83 13 10.83 [190, 205) 30 25.00 43 35.83 [205, 220) 34 28.33 77 64.17 [220, 235) 21 17.50 98 81.67 [235, 250) 15 12.50 113 94.17 [250, 265) 5 4.17 118 98.33 [265, 280) 2 1.67 120 100.00