python与excel

一、安装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)查找某个元素的索引

DataFrame数据的计算方法
函数作用
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='总计')#用读取的数据制作数据透视表
pivot_table的参数
参数含义
data用于指定要制作数据透视表的数据区域
values用于指定汇总计算的字段
index用于指定行字段
columns用于指定列字段
aggfunc用于指定汇总的计算方式
fill_value用于指定填充缺失值的内容,默认不填充
margins用于设置是否显示行列的总计数据,为False时不显示
dropna用于设置当汇总后的整行数据都为空值时是否丢弃该行,为True丢弃
margins_name用于设置总计数据行的名称

 

     本文章是通过读电子书《超简单,用python让Excel飞起来》的读书笔记。通过整理和测试以及解决问题是本文的来源。希望对大家有帮助,如果有侵权问题,请及时联系2635010041@qq.com.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值