python大数据与机器学习与商业实战
一、数据分析numpy、pandas、matploylib库的使用¶
5 Excel文件的读写
5.1 通过read_excel进行文件的读写
import pandas as pd
data = pd.read_excel('data.xlsx',sheet_name=0)
# 通过相对路径读取文件,data为DataFrame结构,shee_name为工作表名称,encoding='utf-8'已经不需要了
data.head() #默认打印前5行内容 ,可进行修改
E:\Assembly language\Anaconda\Soft\lib\site-packages\openpyxl\worksheet\header_footer.py:48: UserWarning: Cannot parse header or footer so it will be ignored
warn("""Cannot parse header or footer so it will be ignored""")
|
date |
score |
price |
0 |
2018-09-03 |
70 |
23.55 |
1 |
2018-09-04 |
75 |
24.43 |
2 |
2018-09-05 |
65 |
23.41 |
3 |
2018-09-06 |
60 |
22.81 |
4 |
2018-09-07 |
70 |
23.21 |
data = pd.read_csv('data.csv',delimiter=',',encoding='utf-8')
#delimiter用于指定分隔符号默认逗号,encoding指定编码方式 utf-8 或者gbk防止乱码
data.head()
|
date |
score |
price |
0 |
2018-09-03 |
70 |
23.55 |
1 |
2018-09-04 |
75 |
24.43 |
2 |
2018-09-05 |
65 |
23.41 |
3 |
2018-09-06 |
60 |
22.81 |
4 |
2018-09-07 |
70 |
23.21 |
5.2 文件的写入
data = pd.DataFrame([[1,2],[3,4],[3,4],[5,6]],columns=['A列','B列'])#新建一个文件
data.to_excel('data_new.xlsx')
to_excel() 函数常用参数 sheet_name\index(是否写入行索引信息True or Flase)\columns(指定要写入的列)\encoding(指定编码方式)
to_csv() 同理,但encoding得设置为utf_8_sig
data.to_csv('演示.csv',index=False,encoding="utf_8_sig")
5.3 绝对路径和相对路径
相对路径:代码文件所在的文件夹
绝对路径:文件的完整路径D:\Jupyter\data.xlsx
python中\表示特殊含义,需要消除影响,有两种写法
1、data.to_excel('D:\Jupyter\date.xlsx')
2、data.tp_excel(r'E:\Jupyter\data.xlsx)
data.to_excel('D:\\Jupyter\\date.xlsx') #D盘下就会生成了一个新的文件
6 数据的选取与处理
data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]]
,index=['r1','r2','r3'],columns=['c1','c2','c3'])
data
|
c1 |
c2 |
c3 |
r1 |
1 |
2 |
3 |
r2 |
4 |
5 |
6 |
r3 |
7 |
8 |
9 |
6.1 数据选取
# 按列选取
a = data['c1'] #返回的数据是一个一维的Series类型数据,不包括列索引信息
print(a)
b = data[['c1']] #打印索引信息
print(b)
c = data[['c1','c3']] #选取多列信息
print(c)
r1 1
r2 4
r3 7
Name: c1, dtype: int64
c1
r1 1
r2 4
r3 7
c1 c3
r1 1 3
r2 4 6
r3 7 9
# 按行选取
a = data[1:3] #序号从零开始 左闭右开
print(a)
c1 c2 c3
r2 4 5 6
r3 7 8 9
# iloc方法
b = data.iloc[1:3] # 更加直观不易混淆
c = data.iloc[-1] # 选取单行只能使用iloc方法
d = data.loc[['r2','r3']] # 根据名称选择数据 注意是loc
f = data.head(2)# 选取前几行的数据
print(b)
print(c)
print(d)
print(f)
c1 c2 c3
r2 4 5 6
r3 7 8 9
c1 7
c2 8
c3 9
Name: r3, dtype: int64
c1 c2 c3
r2 4 5 6
r3 7 8 9
c1 c2 c3
r1 1 2 3
r2 4 5 6
# 按区块选取
a = data[0:2][['c1','c3']] # c1行和c2行的前两列数据
a = data[['c1','c3']][0:2] # 换一种写法也是适用的
b = data.iloc[0:2][['c1','c3']] #官方推荐的用法
d = data.loc[['r1','r2'],['c1','c3']] #loc使用字符串作为索引
e = data.iloc[0:2,[0,2]] # iloc使用数字作为索引
a,b
( c1 c3
r1 1 3
r2 4 6,
c1 c3
r1 1 3
r2 4 6)
6.2 数据筛选
a = data[data['c1']>5] #筛选c1列中数字大于5的行
a
# 多个筛选条件时可以使用&且 |或 进行连接
b = data[(data['c1']>1)&(data['c2']<8)]
b
6.3 数据整体情况查看
data.shape # 获取表格整体行数和列数
(3, 3)
data.describe()
#获得每一列数据个数、平均值、标准差、最小值、25分位数、50分位数、75分位数、最大值
|
c1 |
c2 |
c3 |
count |
3.0 |
3.0 |
3.0 |
mean |
4.0 |
5.0 |
6.0 |
std |
3.0 |
3.0 |
3.0 |
min |
1.0 |
2.0 |
3.0 |
25% |
2.5 |
3.5 |
4.5 |
50% |
4.0 |
5.0 |
6.0 |
75% |
5.5 |
6.5 |
7.5 |
max |
7.0 |
8.0 |
9.0 |
data['c1'].value_counts()#c1列三种数据且都为1
# 查看每列有几种数据 以及出现的频次
4 1
1 1
7 1
Name: c1, dtype: int64
6.4 数据运算、排列、删除
data['c4'] = data['c3']-data['c1'] #从已有列中运算创建新的一列
data
|
c1 |
c2 |
c3 |
c4 |
r1 |
1 |
2 |
3 |
2 |
r2 |
4 |
5 |
6 |
2 |
r3 |
7 |
8 |
9 |
2 |
# a 使用sort_values()函数对表格进行排序,by用于指定哪一列,ascending默认为True表示升序排列
a = data.sort_values(by='c2',ascending=False)
a
|
c1 |
c2 |
c3 |
c4 |
r3 |
7 |
8 |
9 |
2 |
r2 |
4 |
5 |
6 |
2 |
r1 |
1 |
2 |
3 |
2 |
# b 使用sort_index()函数根据行索引进行排序
a = a.sort_index() # 行索引进行升序排列
a
|
c1 |
c2 |
c3 |
c4 |
r1 |
1 |
2 |
3 |
2 |
r2 |
4 |
5 |
6 |
2 |
r3 |
7 |
8 |
9 |
2 |
# c 使用drop函数删除表格中的指定数据
# DataFrame.drop(index=None,columns=None,inplace=Flase)
# index指定要删除的行、columns指定删除的列,代码中要输入行索引的名称而不是数字序号
# inplace默认为False不改变原表格,返回一个新表格
a = data.drop(columns='c1') #删除单列数据
b = data.drop(columns=['c1','c3']) #删除多列数据
c = data.drop(index=['r1','r3']) # 删除行数据
6.5 数据表的拼接
import pandas as pd
df1 = pd.DataFrame({'公司':['万科','阿里','百度'],'分数':[90,95,85]})
df2 = pd.DataFrame({'公司':['万科','阿里','京东'],'股价':[20,180,30]})
df1,df2
( 公司 分数
0 万科 90
1 阿里 95
2 百度 85,
公司 股价
0 万科 20
1 阿里 180
2 京东 30)
# a merge()函数 根据一个或者多个键将数据表中的行连接起来
df3 = pd.merge(df1,df2) #默认选取两个表共有列内容
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90 |
20 |
1 |
阿里 |
95 |
180 |
df3 = pd.merge(df1,df2,on='公司')#取交集 inner连接
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90 |
20 |
1 |
阿里 |
95 |
180 |
df3 = pd.merge(df1,df2,how='outer') #选取两个表格的并集
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90.0 |
20.0 |
1 |
阿里 |
95.0 |
180.0 |
2 |
百度 |
85.0 |
NaN |
3 |
京东 |
NaN |
30.0 |
df3 = pd.merge(df1,df2,how='left') #对左边比较在意,完整保留左边数据
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90 |
20.0 |
1 |
阿里 |
95 |
180.0 |
2 |
百度 |
85 |
NaN |
df3 = pd.merge(df1,df2,left_index=True,right_index=True) #按照行索引进行合并
df3
|
公司_x |
分数 |
公司_y |
股价 |
0 |
万科 |
90 |
万科 |
20 |
1 |
阿里 |
95 |
阿里 |
180 |
2 |
百度 |
85 |
京东 |
30 |
df3 = df1.join(df2,lsuffix='_x',rsuffix='_y')
# 表中存在同名列需要设置 lsuffix左表同名列、rsuffix右表同名列参数
df3
|
公司_x |
分数 |
公司_y |
股价 |
0 |
万科 |
90 |
万科 |
20 |
1 |
阿里 |
95 |
阿里 |
180 |
2 |
百度 |
85 |
京东 |
30 |
# b concat()函数 把数据直接进行合并,通过axis参数指定连接的轴向
df3 = pd.concat([df1,df2],axis=0) #axis=1为横向拼接 ignore_index=True可以生成新的索引
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90.0 |
NaN |
1 |
阿里 |
95.0 |
NaN |
2 |
百度 |
85.0 |
NaN |
0 |
万科 |
NaN |
20.0 |
1 |
阿里 |
NaN |
180.0 |
2 |
京东 |
NaN |
30.0 |
# c append()函数,concat()函数的简化版
df3 = df1.append(df2)
df4 = df1.append({'公司':'腾讯','分数':'90'},ignore_index=True)
df3
|
公司 |
分数 |
股价 |
0 |
万科 |
90.0 |
NaN |
1 |
阿里 |
95.0 |
NaN |
2 |
百度 |
85.0 |
NaN |
0 |
万科 |
NaN |
20.0 |
1 |
阿里 |
NaN |
180.0 |
2 |
京东 |
NaN |
30.0 |