一、安装anaconda(阿里云镜像库)
pip config list -v#pip在哪里寻找pip.conf文件
阿里云镜像:
1、安装完成,命令行输入:conda config生成.condarc文件(运行期配置文件)
2、如果原本的源中的源地址是 https,可以直接改成http即可。这个方法可以特别注意,因为https有时候会出现连接错误的问题,改成http后不会再出现此类问题
参考链接:https://blog.csdn.net/weixin_51484460/article/details/122179000
3、conda包管理器
conda env list#查找包文件目录
conda install <package>#安装需要的包
conda -V#版本
conda create --name <new_env_environment> --clone <copied_env_environment>#复制环境并创建新的环境
二、anaconda的编辑和xlwings操作
1、创建20个excel
"""
编程os:mac
"""
import xlwings as xw
app=xw.App(visible=True,add_book=False)
for i in range(1,21):
workbook=app.books.add()
workbook.save(f'/Users/Tina/Desktop/20220607/分公司{i}.xlsx')
workbook.close()
app.quit()
2、打开一个已存在的xlsx表,并在第一个单元格添加内容,并添加一个工作表
import xlwings as xw
app=xw.App(visible=True,add_book=False)
workbook=app.books.open('/Users/Tina/Desktop/20220607/分公司1.xlsx')
#指定的工作簿必须真实存在,并且不能处于已打开的状态
worksheet=workbook.sheets['Sheet1']
worksheet.range('A1').value="编号"
workbook.sheets.add('产品统计表')
三、数组计算的数学模块——NumPy(前闭后开)
NumPy模块(Numerical Python缩写)一个运算速度非常快的数学模块
import numpy as np
a=[1,2,3,4]
b=np.array([1,2,3,4])
print(type(a),a)
print(type(b),b)
"""
运行结果:<class 'list'> [1, 2, 3, 4]
<class 'numpy.ndarray'> [1 2 3 4]
"""
1、数组能够很好的支持一些数学运算
import numpy as np
a=[1,2,3,4]
b=np.array([1,2,3,4])
print(a*2)
print(b*2)
"""
运算结果:
[1, 2, 3, 4, 1, 2, 3, 4]
[2 4 6 8]
"""
2、数组可以存储多维数据,而列表通常只能存储一维数据
import numpy as np
a=[[1,2],[3,4],[5,6]]
b=np.array([[1,2],[3,4],[5,6]])
print(a)
print(b)
"""
执行结果:
[[1, 2], [3, 4], [5, 6]]
[[1 2]
[3 4]
[5 6]]
"""
3、创建一维数组
import numpy as np
#一位默认是终止值
a=np.arange(5)
#步长默认为1
b=np.arange(5,10)
#起点5,终点值10,步长2
c=np.arange(5,10,2)
print(a)
print(b)
print(c)
"""
输出结果:
[0 1 2 3 4]
[5 6 7 8 9]
[5 7 9]
"""
4、创建一个一维数组,其中包含服从正态分布(均值为0、标准差为1的分布)的三个随机数
import numpy as np
a=np.random.randn(3)
print(a)
"""
执行结果:
[ 0.31614956 0.87779118 -0.78618781]
"""
5、创建二维数组
import numpy as np
#创建一个一维数组,然后转化成3行4列的二位数组
a=np.arange(12).reshape(3,4)
print(a)
"""
运行结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
"""
####创建随机二维数组####
import numpy as np
#第一个起始值,第二个终止值,4行,4列
a=np.random.randint(0,10,(4,4))
print(a)
"""
运行结果:
[[1 1 3 4]
[5 7 6 3]
[0 1 9 8]
[2 4 7 7]]
"""
四、数据导入和整理模块——pandas
1、pandas数据
import pandas as pd
a=pd.Series(['张三','李四','王五'])
print(a)
"""
运行结果:
0 张三
1 李四
2 王五
dtype: object
"""
2、二维数据表格DataFrame
#####################列表创建DataFrame###################
import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]])
print(a)
"""
运行结果:
0 1
0 1 2
1 3 4
2 5 6
结论:该数据结构存在行和列索引
"""
###############创建类似excel的行列结构#######################
import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])
print(a)
"""
运行结果:
date score
A 1 2
B 3 4
C 5 6
"""
#######################另一种创建方式#########################
import pandas as pd
a=pd.DataFrame()
date=[1,3,5]
score=[2,4,6]
a['date']=date
a['score']=score
print(a)
"""
运行结果:
date score
0 1 2
1 3 4
2 5 6
"""
######################通过字典创建DataFrame###################
import pandas as pd
a=pd.DataFrame({'a':[1,3,5],'b':[2,4,6]},index=['x','y','z'])
print(a)
"""
打印结果:
a b
x 1 2
y 3 4
z 5 6
"""
###############以字典的键名作为行索引#####################
import pandas as pd
a=pd.DataFrame.from_dict({'a':[1,3,5],'b':[2,4,6]},orient='index')
print(a)
"""
打印结果:
0 1 2
a 1 3 5
b 2 4 6
"""
################通过二维数组创建DateFrame########################
import pandas as pd
import numpy as np
a=np.arange(12).reshape(3,4)
b=pd.DataFrame(a,index=[1,2,3],columns=['A','B','C','D'])
print(b)
"""
打印结果:
A B C D
1 0 1 2 3
2 4 5 6 7
3 8 9 10 11
"""
3、修改索引
import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]],index=['A','B','C'],columns=['date','score'])
a.index.name='公司'
print(a)
"""
打印结果:
date score
公司
A 1 2
B 3 4
C 5 6
"""
###################################################################
import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]],index=['A','B','C'],columns=['date','score'])
a.rename(index={'A':'万科','B':'阿里','C':'百度'},columns={'date':'日期','score':'分数'},inplace=True)
print(a)
"""
执行结果:
日期 分数
万科 1 2
阿里 3 4
百度 5 6
"""
#####################将行索引转换为常规列###################
a.index.name='公司'
a=a.reset_index()
"""
公司 日期 分数
0 万科 1 2
1 阿里 3 4
2 百度 5 6
"""
####################把常规列转换为行索引####################
a=a.set_index('日期')
"""
公司 分数
日期
1 万科 2
3 阿里 4
5 百度 6
"""
4、文件的读取和写入
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
print(data)
"""
执行结果:
公司 哈哈
0 百度 卡看
1 分数 啦啦
"""
#也可读取CVS格式,pd.read_csv('data.csv')
###################################写入#########################################
import pandas as pd
data=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列'])
data.to_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
#把A列数据写入工作簿并忽略行索引信息
data.to_excel('data.xlsx', columns=['A列'],index=False)
#CSV同理
data.to_csv('data.csv')
5、数据的选取、筛选、排序、运算与删除
1》数据的选取
1)按列选取数据
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
#选取列,返回一个一维的Series
a=data['A列']
#返回二维的表格数据
b=data[['A列']]
#多列表格数据
c=data[['A列','B列']]
print(a)
print(b)
print(c)
"""
打印结果:
0 1
1 3
2 5
Name: A列, dtype: int64
A列
0 1
1 3
2 5
A列 B列
0 1 2
1 3 4
2 5 6
"""
2)按行选取数据
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data[1:3]#按行选取数据,左闭右开
print(a)
"""
运行结果:
Unnamed: 0 A列 B列
1 1 3 4
2 2 5 6
"""
#####################以上方法可能引起错误######################
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data.iloc[1:3]#按行选取数据,左闭右开
#使用行的名称进行选取
b=data.loc[[1,2]]
#行比较多,可以进行head前几行的选取
c=data.head(2)
print(a)
print(b)
print(c)
"""
Unnamed: 0 A列 B列
1 1 3 4
2 2 5 6
Unnamed: 0 A列 B列
1 1 3 4
2 2 5 6
Unnamed: 0 A列 B列
0 0 1 2
1 1 3 4
"""
3)按区块进行选取
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data[['A列','B列']][0:2]#按区块进行选取
#同上
b=data.iloc[0:2][['A列','B列']]
print(a)
print(b)
"""
运行结果:
A列 B列
0 1 2
1 3 4
A列 B列
0 1 2
1 3 4
"""
##########################选取单个单元格##############################
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data.iloc[0]['A列']#先选行,再选列,选取单个单元格
#选取多个单元格,i表示索引
b=data.iloc[0:2,[1,2]]
c=data.loc[[0,1],['A列','B列']]
print(a)
print(b)
print(c)
"""
运行结果:
1
A列 B列
0 1 2
1 3 4
A列 B列
0 1 2
1 3 4
"""
data.ix[[0:2,['A列','B列']]#索引不必须为字符串或数字
2》数据的筛选
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data[data['A列']>1]
b=data[(data['A列']>1)&(data['B列']==4)]
print(a)
print(b)
"""
运算结果:
Unnamed: 0 A列 B列
1 1 3 4
2 2 5 6
Unnamed: 0 A列 B列
1 1 3 4
"""
3》数据的排序
按A列进行降序排序
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
a=data.sort_values(by='A列',ascending=False)
print(a)
"""
运行结果:
Unnamed: 0 A列 B列
2 2 5 6
1 1 3 4
0 0 1 2
"""
###################按照行索引进行升序###################
b=data.sort_index(ascending=True)#按照行索引进行排序
print(b)
"""
运行结果:
Unnamed: 0 A列 B列
0 0 1 2
1 1 3 4
2 2 5 6
"""
4》数据的运算
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
data['C列']=data['B列']-data['A列']
print(data)
"""
运算结果:
Unnamed: 0 A列 B列 C列
0 0 1 2 1
1 1 3 4 1
2 2 5 6 1
"""
5》数据的删除
import pandas as pd
data=pd.read_excel('/Users/Tina/Desktop/20220607/分公司1.xlsx')
data.drop(columns='A列')#单列删除
data.drop(columns=['A列','B列'])#进行列数据删除
data.drop(index=[1,2],inplace=True)#进行行数据删除;inplace=True会改变DataFrame的结构
print(data)
"""
运行结果:
Unnamed: 0 A列 B列
0 0 1 2
"""
6、数据表的拼接
1)合并merge
import pandas as pd
df1=pd.DataFrame({'公司':['百度','腾讯','静思'],'分数':[90,98,65]})
df2=pd.DataFrame({'公司':['百度','腾讯','静思2'],'股价':[33,49,10]})
print(df1)
print(df2)
"""
执行结果:
公司 分数
0 百度 90
1 腾讯 98
2 静思 65
公司 股价
0 百度 33
1 腾讯 49
2 静思2 10
"""
###############merge()默认选取两个列共有的内容,根据相同的列名进行合并#########
df3=pd.merge(df1,df2)
print(df3)
"""
运行结果:
公司 分数 股价
0 百度 90 33
1 腾讯 98 49
"""
############如果同名的列不止一个,on指定按照哪一列进行合并######################
df3=pd.merge(df1,df2,on='公司')
####################默认合并方式取交集,并集outer########################
df3=pd.merge(df1,df2,how='outer')
"""
运行结果:
公司 分数 股价
0 百度 90.0 33.0
1 腾讯 98.0 49.0
2 静思 65.0 NaN
3 静思2 NaN 10.0
"""
############保留左表全部内容,右表不太在意#####################
df3=pd.merge(df1,df2,how='left')#右表同理
"""
运行结果:
公司 分数 股价
0 百度 90 33.0
1 腾讯 98 49.0
2 静思 65 NaN
"""
############按照行索引进行合并##############
df3=pd.merge(df1,df2,left_index=True,right_index=True)
"""
公司_x 分数 公司_y 股价
0 百度 90 百度 33
1 腾讯 98 腾讯 49
2 静思 65 静思2 10
"""
2)连接concat
df3=pd.concat([df1,df2],ignore_index=True)
"""
运行结果:
公司 分数 股价
0 百度 90.0 NaN
1 腾讯 98.0 NaN
2 静思 65.0 NaN
3 百度 NaN 33.0
4 腾讯 NaN 49.0
5 静思2 NaN 10.0
"""
#############横向拼接##############
df3=pd.concat([df1,df2],axis=1)#横向拼接
"""
公司 分数 公司 股价
0 百度 90 百度 33
1 腾讯 98 腾讯 49
2 静思 65 静思2 10
"""
##############append简化版concat#########
df3=df1.append({'公司':'腾飞','分数':'90'},ignore_index=True)
"""
运行结果:
公司 分数
0 百度 90
1 腾讯 98
2 静思 65
3 腾飞 90
"""
五、数据可视化模块——Matplotlib
1、绘制折线图
import matplotlib.pyplot as plt
x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.plot(x,y)
plt.show()
2、绘制柱形图
a=[1,2,3,4,5,6]
b=[6,5,4,3,2,1]
plt.bar(a,b)
plt.show()
六、模块的交互
1、xlwings与pandas模块交互
用pandas模块创建数据表格,在用xlwings将并表格写入工作簿
import xlwings as xw
import pandas as pd
app=xw.App(visible=False)#打开app
workbook=app.books.add()#新建工作簿
worksheet=workbook.sheets.add('新工作表')
df=pd.DataFrame([[1,2],[3,4]],columns=['a','b'])
worksheet.range('A1').value=df
workbook.save('/Users/Tina/Desktop/20220607/分公司1.xlsx')
workbook.close()
app.quit()
2、xlwings和matplotlib模块交互
新建一个柱形图,打开excel并写进去
import xlwings as xw
import matplotlib.pyplot as plt
figure=plt.figure()
x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.plot(x, y)
app=xw.App(visible=False)#打开app
workbook=app.books.open('/Users/Tina/Desktop/20220607/分公司1.xlsx')#打开一个已存在的工作簿
worksheet=workbook.sheets.add('工作表')#添加一个工作表
#将绘制的图标写入工作表
worksheet.pictures.add(figure,name='图片1',update=True,left=100)
workbook.save()
workbook.close()
app.quit()
xw.App(visible=True,add_book=False)#显示程序窗口,不新建工作簿
#拼接字符串的方法
a=f'{name}今年{age}岁。'#拼接字符串的方法除了“+”,还有f-string方法。其中name和age是变量
#format拼接法
b='{}今年{}岁。'.format('小明',7)
c='{1}今年{0}岁。'.format(7,'小明')
d='{name}今年{age}岁。'.format(name='小明',age=7)
七、批量处理
1、批量打开
import os
import xlwings as xw
file_path='/Users/tianqiurong.vendor/Desktop/20220607'
file_list=os.listdir(file_path)#获取目录列表
app=xw.App(visible=True,add_book=False)#打开app
for i in file_list:
if os.path.splitext(i)[1]=='.xlsx':#假如是excel文件即打开
try:
app.books.open(file_path+"/"+i)#拼接目录
except Exception:
pass
"""
由于存在~$开头的临时文件就会报错,因此添加异常处理,可以通过以下方式跳过
"""
for i in file_list:
if os.path.splitext(i)[1]=='.xlsx':
if i.startswith('~$'):
continue
#批量修改工作表名,把所有带销售的删除这两个字
for i in range(len(worksheets)):
worksheets[i].name=worksheets[i].name.replace('销售','')
#只想重命名前五个
for i in range(len(worksheets))[:5]:
#重命名工作簿
#替换文件名的部分内容
new_file=i.replace(old_book_name,new_book_name)
#路径拼接
old_file_path=os.path.join(file_path,i)
new_file_path=os.path.join(file_path,new_file)
#重命名工作簿的完整路径
os.rename(old_file_path,new_file_path)
#删除工作表
worksheet.delete()
#打印工作簿
workbook=app.books.open(file_path)#打印工作簿,需要先打开工作簿
workbook.api.PrintOut()#打印工作簿
worksheet.api.PrintOut()#打印个别工作表
booksheet.range('A1').expand('table').value#等价于booksheet.range('A1').expand().value
workbooks.sheets.add(name=name,after=len(workbooks.sheets))#after表示放在哪个下标对应的表后
2、把产品单独筛出来做表
import xlwings as xw
file_path='e:\\table\\产品统计表.xlsx'
sheet_name='统计表'
app=xw.App(visible=True,add_book=False)
workbook=app.books.open(file_path)
worksheet=workbook.sheets[sheet_name]
value=worksheet.range('A2').expand('table').value#确定范围
data=dict()
for i in range(len(value)):
product_name=value[i][1]#i代表行,1代表列从0开始
if product_name not in data:
data[product_name]=[]#创建一个当前行的空数据
data[product_name].append(value[i])#将当前行数据追加到当前
for key,value in data.items():
new_workbook=xw.books.add()
new_worksheet=new_workbook.sheets.add(key)
new_worksheet['A1'].value=worksheet['A1:H1'].value#列标题复制到新建的工作表中
new_worksheet['A2'].value=value
new_workbook.save('{}.xlsx'.format(key))#以当前产品名称作为文件名保存在目标工作簿中
app.quit()#退出excel程序
3、 按条件将一个工作表拆分为多个工作表
values=worksheet.range('A1').options(pd.DataFrame,header=1,index=False,expand='table').value
#读取要拆分的工作表数据
data=value.groupby('产品名称')#将数据按照“产品名称”分组
filterd=values[values['采购物品']=='复印纸']#提取采购物品为复印纸的行数据
4、单元格属性
value=worksheet.range('A1').expand('table')#在工作表中选择要调整的行高和列宽的单元格区域
value.column_width=12#将列宽调整为可容纳12个字符的宽度
value.row_height=20#将行高调整为20磅
row_num=value['A1'].current_region.last_cell.row#获取工作表中数据区域最后一行的行号
vlaue['A2:A{}'.format(row_num)].number_format='m/d'#将A列的“采购日期”数据全部更改为“月/日”格式
value['D2:D{}'.format(row_num)].number_format='¥#,##0.00'#将采购金额全部更改为带货币符号和两位小数的格式
#修改外观
worksheet['A1:H1'].api.Font.Name='宋体'#工作表标题行的字体
worksheet['A1:H1'].api.Font.Size=10#工作表标题行的字号
worksheet['A1:H1'].api.Font.Bold=True#工作表标题行加粗
worksheet['A1:H1'].color=xw.utils.rgb_to_int((0,0,0))#标题行的单元格填充颜色
worksheet['A1:H1'].api.HorizontalAlignment=xw.constants.HAlign.xlHAlignCenter
#设置工作表标题行的水平对齐方式为居中
worksheet['A1:H1'].api.VirticalAlignment=xw.constants.VAlign.xlHAlignCenter
#设置工作表标题行的垂直对齐方式为居中
worksheet['A1:H1'].api.Borders(b).LineStyle=1#设置单元格的边框线形
worksheet['A1:H1'].api.Borders(b).Weight=2#设置单元格的边框粗细
enumerate(value)#按行遍历工作表数据 ,数据值是数组形式[,,]
value.shape[0]#数据的行数
value.shape[1]#数据的列数
new_values=value['规格‘].str.split('*',expand=True)#根据*将规格列进行分割
value['长(mm)']=new_values[0]#把分离的第一部分放入列"长(mm)"中
worksheet.autofit()#根据数据内容自动调整工作表的行高和列宽
#合并列
value['规格']=value['长(mm)'].astype('str')+'*'+value['宽']
#删除列
value.drop(columns=['宽'],inplace=True)#删除为宽的列
worksheet.clear()#清除工作表‘规格表'中原有数据
value=value.T#转置数据的行列
5、行列颠倒
values=worksheet.range('A1').options(pd.DataFrame,header=1,index=False,expand='table').value
values=values.T#行列颠倒
values.columns=values.iloc[0]
values.index.name=values.iloc[0].index.name#赋值第一行为列标题,否则它会看作普通行而不是标题行
print(values)
values.drop(index=[values.iloc[0].index.name],inplace=True)#删除标题行
worksheet.clear()
worksheet['A1'].value=values
data=list(set(data))# 列表去重
data.insert(0,'书名')#插入书名
new_worksheet['A1'].options(transpose=True).value=data#将整理好的书名数据写入新工作表
八、批量分析
1、排序
函数:sort_values(by='data') |
对data列进行升序排序 |
values=worksheet.range('A1').expand('table').options(pd.DataFrame).value result=values.sort_values(by='销售利润')#对销售利润进行升序排列 参数ascending为True则为升序,反之降序 |
2、运算
last_cell=worksheet['A1'].expand('table').last_cell#获取最后一个单元格
last_row=last_cell.row#获取最后一行的行号
last_column=last_cell.column#获取最后一列的列号
last_column_letter=chr(64+last_column)#将数据区域最后一列的列号装换成该列的列表(字母)
formula="=SUM({}2:{})".format(last_column_letter,sum_last_row_name)
worksheet['D3'].formula=formula#求和公式
dataFrame.reindex(index=[],columns=[],fill_value=0)#index要改变位置的行,columns要改变位置的列,当都不存在时,填充不存在的单元格fill_value
values.astype('float')#对dataFrame进行数据转换
values.groupby('').sum()#对数据进行分组,求和
data[''采购"].sum()#在df中进行求和
index(obj,start,end)查找某个元素的索引
函数 | 作用 |
sum() | 列数据求和 |
min() | 求列的最小值 |
max() | 求列的最大值 |
mean() | 求平均值 |
count() | 计算行轴的非空数量 |
value_counts() | 统计重复值的个数 |
product() | 计算乘积 |
std() | 计算标准差 |
3、数据透视表
values=i.range('A1').expand('table').options(pd.DataFrame.value)#读取当前工作表的数据
pivottable=pd.pivot_table(values,values='销售金额',index='销售地区‘,columns='销售分部',aggfunc='sum',fill_value=0,margins=True,margins_name='总计')#用读取的数据制作数据透视表
参数 | 含义 |
data | 用于指定要制作数据透视表的数据区域 |
values | 用于指定汇总计算的字段 |
index | 用于指定行字段 |
columns | 用于指定列字段 |
aggfunc | 用于指定汇总的计算方式 |
fill_value | 用于指定填充缺失值的内容,默认不填充 |
margins | 用于设置是否显示行列的总计数据,为False时不显示 |
dropna | 用于设置当汇总后的整行数据都为空值时是否丢弃该行,为True丢弃 |
margins_name | 用于设置总计数据行的名称 |
本文章是通过读电子书《超简单,用python让Excel飞起来》的读书笔记。通过整理和测试以及解决问题是本文的来源。希望对大家有帮助,如果有侵权问题,请及时联系2635010041@qq.com.