由于本书重点介绍Python的数据分析,所以对Python编程的基础知识将不展开讨论。
for i in [1,2,3,4]: #range(1,n)表示1到n-1的列表
print(i)
1 2 3 4
[i for i in range(1,5)] #循环的简洁写法
[1, 2, 3, 4]
#fruits = ['banana', 'apple', 'mango']
for fruit in ['banana','apple','mango']: #fruits:
print('当前水果 :', fruit)
当前水果 : banana 当前水果 : apple 当前水果 : mango
a = -100
if a < 100:
print("a的数值小于 100")
else:
print("a的数值大于 100")
a的数值小于 100
a if a<0 else a #ifelse的简洁语法
-100
def xbar(x):
n=len(x)
S=sum([i for i in x])
xbar=S/n #sum(x)/n
return(xbar)
X=[1,3,6,4,9,7,5,8,2]; X
[1, 3, 6, 4, 9, 7, 5, 8, 2]
xbar(X)
5.0
import numpy as np
np.mean(X) #Python已内建这些函数命令,可直接使用
5.0
def SS1(x): #计算离均差平方和函数
n=len(x)
S1=sum([i for i in x]) #计算列表的和
S2x=sum([i*i for i in x]) #计算列表的平方和
Sx2=sum([i for i in x])**2 #计算列表和的平方
SS=S2x-Sx2/n
return(SS)
X=[1,3,6,4,9,7,5,8,2]
SS1(X)
60.0
def SS2(x): #返回多个值函数
n=len(x)
S1=sum([i for i in x]) #计算列表的和
xbar=S1/n
S2x=sum([i*i for i in x]) #计算列表的平方和
Sx2=sum([i for i in x])**2 #计算列表和的平方
SS=S2x-Sx2/n
return[n,S1,xbar,S2x,Sx2,SS]
#返回例数、均值、平方和、和的平方、离均差平方和的列表
SS2(X)
[9, 45, 5.0, 285, 2025, 60.0]
SS2(X)[0] #取第 1 个对象
9
SS2(X)[1] #取第 2 个对象
45
SS2(X)[2] #取第 3 个对象
5.0
SS2(X)[3] #取第 4 个对象
285
SS2(X)[4] #取第 5 个对象
2025
SS2(X)[5] #取第 6 个对象
60.0
#可以使用 type 函数来查看数据或对象的类型
type(SS2(X))
list
type(SS2(X)[3])
int
from IPython.core.interactiveshell import InteractiveShell as IS
IS.ast_node_interactivity = "all" #多行命令一次输出
import numpy as np #加载数组包
np.array([1,2,3,4,5]) #一维数组
array([1, 2, 3, 4, 5])
np.array([1,2,3,np.nan,5]) #包含缺失值的数
array([ 1., 2., 3., nan, 5.])
np.arange(9) #数组序列
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
np.arange(1,19,0.5) #等差数列
array([ 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5, 8. , 8.5, 9. , 9.5, 10. , 10.5, 11. , 11.5, 12. , 12.5, 13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5, 17. , 17.5, 18. , 18.5])
np.linspace(1,19,5) #等距数列
array([ 1. , 5.5, 10. , 14.5, 19. ])
B=np.array([[1,2],[3,4],[5,7]]);B #二维数组
array([[1, 2], [3, 4], [5, 7]])
np.array([[1,2,3],[3,4,5],[5,6,6]]) #二维数组
array([[1, 2, 3], [3, 4, 5], [5, 6, 6]])
A=np.arange(9).reshape((3,3));A #形成 3×3 矩阵
array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
A.shape #数组的维度
(3, 3)
A.shape[0] #数组的行数
3
A.shape[1] #数组的列数
3
B.shape
(3, 2)
np.diag(A) #对角阵
array([0, 4, 8])
Z=np.zeros((3,3));Z #零矩阵
array([[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
J=np.ones((3,3));J #1矩阵
array([[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]])
I=np.eye(3);I #单位阵
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
Z+J+I
array([[2., 1., 1.], [1., 2., 1.], [1., 1., 2.]])
I*J
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
(1)创建序列(向量、一维数组)
import pandas as pd #加载数据分析包
#pd.Series() #生成空序列
X=[1,3,6,4,9];X
weight=[67,66,83,68,70]; weight
sex=['女','男','男','女','男']; sex
[1, 3, 6, 4, 9]
[67, 66, 83, 68, 70]
['女', '男', '男', '女', '男']
S1=pd.Series(X);S1
0 1 1 3 2 6 3 4 4 9 dtype: int64
S2=pd.Series(weight);S2
0 67 1 66 2 83 3 68 4 70 dtype: int64
S3=pd.Series(sex);S3
0 女 1 男 2 男 3 女 4 男 dtype: object
pd.concat([S2,S3],axis=0) #按行合并
0 67 1 66 2 83 3 68 4 70 0 女 1 男 2 男 3 女 4 男 dtype: object
pd.concat([S1,S3],axis=1) #按列合并
0 | 1 | |
---|---|---|
0 | 1 | 女 |
1 | 3 | 男 |
2 | 6 | 男 |
3 | 4 | 女 |
4 | 9 | 男 |
S1[2]
6
S3[1:4]
1 男 2 男 3 女 dtype: object
pd.DataFrame() #生成空数据框
pd.DataFrame(X)
0 | |
---|---|
0 | 1 |
1 | 3 |
2 | 6 |
3 | 4 |
4 | 9 |
pd.DataFrame(weight,columns=['weight'], index=['A','B','C','D','E'])
weight | |
---|---|
A | 67 |
B | 66 |
C | 83 |
D | 68 |
E | 70 |
df1=pd.DataFrame({'S1':S1,'S2':S2,'S3':S3}); df1
S1 | S2 | S3 | |
---|---|---|---|
0 | 1 | 67 | 女 |
1 | 3 | 66 | 男 |
2 | 6 | 83 | 男 |
3 | 4 | 68 | 女 |
4 | 9 | 70 | 男 |
df2=pd.DataFrame({'sex':sex,'weight':weight},index=X);df2
sex | weight | |
---|---|---|
1 | 女 | 67 |
3 | 男 | 66 |
6 | 男 | 83 |
4 | 女 | 68 |
9 | 男 | 70 |
df2['weight2']=df2['weight']**2; df2
sex | weight | weight2 | |
---|---|---|---|
1 | 女 | 67 | 4489 |
3 | 男 | 66 | 4356 |
6 | 男 | 83 | 6889 |
4 | 女 | 68 | 4624 |
9 | 男 | 70 | 4900 |
del df2['weight2']; df2
sex | weight | |
---|---|---|
1 | 女 | 67 |
3 | 男 | 66 |
6 | 男 | 83 |
4 | 女 | 68 |
9 | 男 | 70 |
df3=pd.DataFrame({'S2':S2,'S3':S3},index=S1);df3
S2 | S3 | |
---|---|---|
1 | 66.0 | 男 |
3 | 68.0 | 女 |
6 | NaN | NaN |
4 | 70.0 | 男 |
9 | NaN | NaN |
df3.isnull() #是缺失值则返回 True,否则返回 False
S2 | S3 | |
---|---|---|
1 | False | False |
3 | False | False |
6 | True | True |
4 | False | False |
9 | True | True |
df3.isnull().sum() #返回每列包含的缺失值的个数
S2 2 S3 2 dtype: int64
df3.dropna() #直接删除含有缺失值的行,多变量谨慎使用
S2 | S3 | |
---|---|---|
1 | 66.0 | 男 |
3 | 68.0 | 女 |
4 | 70.0 | 男 |
df3
df3.sort_index() #按index排序
S2 | S3 | |
---|---|---|
1 | 66.0 | 男 |
3 | 68.0 | 女 |
6 | NaN | NaN |
4 | 70.0 | 男 |
9 | NaN | NaN |
S2 | S3 | |
---|---|---|
1 | 66.0 | 男 |
3 | 68.0 | 女 |
4 | 70.0 | 男 |
6 | NaN | NaN |
9 | NaN | NaN |
df3.sort_values(by='S3') #按S3列值排序
S2 | S3 | |
---|---|---|
3 | 68.0 | 女 |
1 | 66.0 | 男 |
4 | 70.0 | 男 |
6 | NaN | NaN |
9 | NaN | NaN |
import pandas as pd
pd.set_option('display.max_rows', 10)
#BSdata=pd.read_clipboard(); #从剪切板上复制数据
#BSdata #BSdata.head() 见下节
BSdata=pd.read_csv("DaPy_BS.csv",encoding='utf-8') #GBK
BSdata
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
0 | 1510248008 | 女 | 167 | 71 | 46.0 | 不清楚 | 都未学过 | No |
1 | 1510229019 | 男 | 171 | 68 | 10.4 | 有必要 | 概率统计 | Matlab |
2 | 1512108019 | 女 | 175 | 73 | 21.0 | 有必要 | 统计方法 | SPSS |
3 | 1512332010 | 男 | 169 | 74 | 4.9 | 有必要 | 编程技术 | Excel |
4 | 1512331015 | 男 | 154 | 55 | 25.9 | 有必要 | 都学习过 | Python |
... | ... | ... | ... | ... | ... | ... | ... | ... |
47 | 1538319004 | 男 | 175 | 68 | 44.4 | 不清楚 | 统计方法 | SAS |
48 | 1538254010 | 女 | 166 | 65 | 5.3 | 不清楚 | 编程技术 | Python |
49 | 1540294017 | 女 | 159 | 58 | 71.4 | 不清楚 | 都学习过 | SPSS |
50 | 1540365026 | 女 | 169 | 73 | 5.5 | 有必要 | 统计方法 | Excel |
51 | 1540388036 | 女 | 165 | 67 | 56.8 | 不必要 | 概率统计 | SAS |
52 rows × 8 columns
BSdata=pd.read_excel('DaPy_data.xlsx','BSdata');#BSdata
BSdata.to_csv('BSdata1.csv') #将数据框BSdata保存到BSdata.csv文档中
#将数据框 BSdata 保存到BSdata1.xlsx 文档中
BSdata.to_excel('BSdata.xlsx',index=False) #index=False表示不保存行标签
BSdata.info() #数据框信息
<class 'pandas.core.frame.DataFrame'> RangeIndex: 52 entries, 0 to 51 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 学号 52 non-null int64 1 性别 52 non-null object 2 身高 52 non-null int64 3 体重 52 non-null int64 4 支出 52 non-null float64 5 开设 52 non-null object 6 课程 52 non-null object 7 软件 52 non-null object dtypes: float64(1), int64(3), object(4) memory usage: 3.4+ KB
BSdata.head(10) #显示前5行
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
0 | 1510248008 | 女 | 167 | 71 | 46.0 | 不清楚 | 都未学过 | No |
1 | 1510229019 | 男 | 171 | 68 | 10.4 | 有必要 | 概率统计 | Matlab |
2 | 1512108019 | 女 | 175 | 73 | 21.0 | 有必要 | 统计方法 | SPSS |
3 | 1512332010 | 男 | 169 | 74 | 4.9 | 有必要 | 编程技术 | Excel |
4 | 1512331015 | 男 | 154 | 55 | 25.9 | 有必要 | 都学习过 | Python |
5 | 1516248014 | 男 | 183 | 76 | 85.6 | 不必要 | 编程技术 | Excel |
6 | 1516352030 | 女 | 169 | 71 | 9.1 | 有必要 | 编程技术 | Excel |
7 | 1516171019 | 女 | 166 | 66 | 2.5 | 不必要 | 都未学过 | Excel |
8 | 1516391008 | 女 | 165 | 69 | 35.6 | 不必要 | 都未学过 | Excel |
9 | 1520395019 | 男 | 173 | 63 | 22.8 | 有必要 | 统计方法 | R |
BSdata.tail(10) #显示后5行
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
42 | 1537288004 | 女 | 173 | 70 | 19.1 | 不清楚 | 编程技术 | Python |
43 | 1537359035 | 女 | 174 | 71 | 17.6 | 不清楚 | 概率统计 | No |
44 | 1438391022 | 女 | 164 | 62 | 10.3 | 有必要 | 编程技术 | Python |
45 | 1538399025 | 男 | 169 | 65 | 9.5 | 有必要 | 统计方法 | SAS |
46 | 1438120022 | 男 | 166 | 70 | 35.6 | 有必要 | 统计方法 | R |
47 | 1538319004 | 男 | 175 | 68 | 44.4 | 不清楚 | 统计方法 | SAS |
48 | 1538254010 | 女 | 166 | 65 | 5.3 | 不清楚 | 编程技术 | Python |
49 | 1540294017 | 女 | 159 | 58 | 71.4 | 不清楚 | 都学习过 | SPSS |
50 | 1540365026 | 女 | 169 | 73 | 5.5 | 有必要 | 统计方法 | Excel |
51 | 1540388036 | 女 | 165 | 67 | 56.8 | 不必要 | 概率统计 | SAS |
BSdata.columns #查看列名称
Index(['学号', '性别', '身高', '体重', '支出', '开设', '课程', '软件'], dtype='object')
BSdata.index #数据框行名
RangeIndex(start=0, stop=52, step=1)
BSdata.shape #显示数据框的行数和列数
(52, 8)
BSdata.shape[0] #数据框行数
52
BSdata.shape[1] #数据框列数
8
BSdata.values[:5] #数据框值数组
array([[1510248008, '女', 167, 71, 46.0, '不清楚', '都未学过', 'No'], [1510229019, '男', 171, 68, 10.4, '有必要', '概率统计', 'Matlab'], [1512108019, '女', 175, 73, 21.0, '有必要', '统计方法', 'SPSS'], [1512332010, '男', 169, 74, 4.9, '有必要', '编程技术', 'Excel'], [1512331015, '男', 154, 55, 25.9, '有必要', '都学习过', 'Python']], dtype=object)
BSdata.head()
BSdata.tail()
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
0 | 1510248008 | 女 | 167 | 71 | 46.0 | 不清楚 | 都未学过 | No |
1 | 1510229019 | 男 | 171 | 68 | 10.4 | 有必要 | 概率统计 | Matlab |
2 | 1512108019 | 女 | 175 | 73 | 21.0 | 有必要 | 统计方法 | SPSS |
3 | 1512332010 | 男 | 169 | 74 | 4.9 | 有必要 | 编程技术 | Excel |
4 | 1512331015 | 男 | 154 | 55 | 25.9 | 有必要 | 都学习过 | Python |
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
47 | 1538319004 | 男 | 175 | 68 | 44.4 | 不清楚 | 统计方法 | SAS |
48 | 1538254010 | 女 | 166 | 65 | 5.3 | 不清楚 | 编程技术 | Python |
49 | 1540294017 | 女 | 159 | 58 | 71.4 | 不清楚 | 都学习过 | SPSS |
50 | 1540365026 | 女 | 169 | 73 | 5.5 | 有必要 | 统计方法 | Excel |
51 | 1540388036 | 女 | 165 | 67 | 56.8 | 不必要 | 概率统计 | SAS |
(1)[' ']或“.”法或:
BSdata['身高'].head() #取一列数据,一列时也可用BSdata.身高
0 167 1 171 2 175 3 169 4 154 Name: 身高, dtype: int64
BSdata.身高.head()
0 167 1 171 2 175 3 169 4 154 Name: 身高, dtype: int64
BSdata[['性别','身高','体重']].head() #取两列数据
性别 | 身高 | 体重 | |
---|---|---|---|
0 | 女 | 167 | 71 |
1 | 男 | 171 | 68 |
2 | 女 | 175 | 73 |
3 | 男 | 169 | 74 |
4 | 男 | 154 | 55 |
(2)下标法:
BSdata.iloc[1:3,2:4] #取第1列
身高 | 体重 | |
---|---|---|
1 | 171 | 68 |
2 | 175 | 73 |
BSdata.iloc[1:10,2:4] #取3、4列
身高 | 体重 | |
---|---|---|
1 | 171 | 68 |
2 | 175 | 73 |
3 | 169 | 74 |
4 | 154 | 55 |
5 | 183 | 76 |
6 | 169 | 71 |
7 | 166 | 66 |
8 | 165 | 69 |
9 | 173 | 63 |
BSdata.loc[3] #取第4行
学号 1512332010 性别 男 身高 169 体重 74 支出 4.9 开设 有必要 课程 编程技术 软件 Excel Name: 3, dtype: object
BSdata.loc[3:5] #取3至5行
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
3 | 1512332010 | 男 | 169 | 74 | 4.9 | 有必要 | 编程技术 | Excel |
4 | 1512331015 | 男 | 154 | 55 | 25.9 | 有必要 | 都学习过 | Python |
5 | 1516248014 | 男 | 183 | 76 | 85.6 | 不必要 | 编程技术 | Excel |
BSdata.loc[1:3,['身高','体重']]
身高 | 体重 | |
---|---|---|
1 | 171 | 68 |
2 | 175 | 73 |
3 | 169 | 74 |
BSdata.iloc[1:3,1:5] #0至2行和1至5列数据
性别 | 身高 | 体重 | 支出 | |
---|---|---|---|---|
1 | 男 | 171 | 68 | 10.4 |
2 | 女 | 175 | 73 | 21.0 |
BSdata[BSdata['身高']>180]
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
5 | 1516248014 | 男 | 183 | 76 | 85.6 | 不必要 | 编程技术 | Excel |
10 | 1520100029 | 男 | 184 | 82 | 10.3 | 有必要 | 都学习过 | SAS |
21 | 1525352033 | 男 | 185 | 83 | 5.1 | 有必要 | 都学习过 | SPSS |
32 | 1530243029 | 男 | 186 | 87 | 9.5 | 不必要 | 都未学过 | No |
BSdata[(BSdata['身高']>180) & (BSdata['体重']>80)]
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | |
---|---|---|---|---|---|---|---|---|
10 | 1520100029 | 男 | 184 | 82 | 10.3 | 有必要 | 都学习过 | SAS |
21 | 1525352033 | 男 | 185 | 83 | 5.1 | 有必要 | 都学习过 | SPSS |
32 | 1530243029 | 男 | 186 | 87 | 9.5 | 不必要 | 都未学过 | No |
BSdata['体重指数']=BSdata['体重']/(BSdata['身高']/100)**2
round(BSdata[:5],2)
学号 | 性别 | 身高 | 体重 | 支出 | 开设 | 课程 | 软件 | 体重指数 | |
---|---|---|---|---|---|---|---|---|---|
0 | 1510248008 | 女 | 167 | 71 | 46.0 | 不清楚 | 都未学过 | No | 25.46 |
1 | 1510229019 | 男 | 171 | 68 | 10.4 | 有必要 | 概率统计 | Matlab | 23.26 |
2 | 1512108019 | 女 | 175 | 73 | 21.0 | 有必要 | 统计方法 | SPSS | 23.84 |
3 | 1512332010 | 男 | 169 | 74 | 4.9 | 有必要 | 编程技术 | Excel | 25.91 |
4 | 1512331015 | 男 | 154 | 55 | 25.9 | 有必要 | 都学习过 | Python | 23.19 |
pd.concat([BSdata.身高, BSdata.体重],axis=0) # 按行合并 axis=0
0 167 1 171 2 175 3 169 4 154 ... 47 68 48 65 49 58 50 73 51 67 Length: 104, dtype: int64
pd.concat([BSdata.身高, BSdata.体重],axis=1) #按列合并 axis=1
身高 | 体重 | |
---|---|---|
0 | 167 | 71 |
1 | 171 | 68 |
2 | 175 | 73 |
3 | 169 | 74 |
4 | 154 | 55 |
... | ... | ... |
47 | 175 | 68 |
48 | 166 | 65 |
49 | 159 | 58 |
50 | 169 | 73 |
51 | 165 | 67 |
52 rows × 2 columns
BSdata.iloc[:5,:8].T #数据框转置 .T
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
学号 | 1510248008 | 1510229019 | 1512108019 | 1512332010 | 1512331015 |
性别 | 女 | 男 | 女 | 男 | 男 |
身高 | 167 | 171 | 175 | 169 | 154 |
体重 | 71 | 68 | 73 | 74 | 55 |
支出 | 46.0 | 10.4 | 21.0 | 4.9 | 25.9 |
开设 | 不清楚 | 有必要 | 有必要 | 有必要 | 有必要 |
课程 | 都未学过 | 概率统计 | 统计方法 | 编程技术 | 都学习过 |
软件 | No | Matlab | SPSS | Excel | Python |