二、python数据分析pandas库的使用

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
c1 c2 c3
r3 7 8 9
# 多个筛选条件时可以使用&且 |或 进行连接
b = data[(data['c1']>1)&(data['c2']<8)]
b
c1 c2 c3
r2 4 5 6

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