python表格处理--1

发布时间 2023-03-22 21:16:05作者: 妖孽成佛
import numpy as np
# a = np.array([1,2,4,5]) # 创建一组数组
# b = np.array([[1,2],[3,4],[5,6]]) # 创建二维数组
# x = np.arange(5) # 1个参数,起点取默认值0,参数值为终点,步长取默认值1,左闭右开
# y = np.arange(5,10) # 2个参数,第一个参数为起点,第二个参数为终点,步长取默认值1,左闭右开
# z = np.arange(5,10,2) # 3个参数,第一个参数为起点,第二个参数为终点,第三个参数为步长,左闭右开
# print(x)
# print(y)
# print(z)
# 用np.random.randn(3)创建一个一维数组,其中包含服从正态分布(均值为0,标准差为1的分布)的3个随机数
# c = np.random.randn(3)
# print(c)
# 将包含0-11的12个整数的一维数组转换成3行4列的二维数组
# d = np.arange(12).reshape(3,4)
# print(d)
# # 创建随机整数二维数组
# e = np.random.randint(0,10,(4,4))
# print(e)

import pandas as pd
# s= pd.Series(['a','b','c',])
# print(s)

# a = pd.DataFrame([[1,2],[3,4],[5,6]],columns = ['data','score'],
# index = ['A','B','C'])
# print(a)


# a = pd.DataFrame() # 创建一个空DataFrame
# date = [1,3,5]
# score = [2,4,6]
# a['date'] = date
# a['score'] = score
# print(a)


# b = pd.DataFrame({'a':[1,3,5],'b':[2,4,6]},index=['x','y','z'])
# print(b)

# 如果想以字典的键名作为行索引,可以用from_dict()函数将字典转换成DataFrame,同时设置参数orient的值为'index'。演示代码如下:

# import pandas as pd
# c = pd.DataFrame.from_dict({'a':[1,3,5],'b':[2,4,6]}, orient='index')
# print(c)

# import numpy as np
# import pandas as pd
# a = np.arange(12).reshape(3,4)
# b = pd.DataFrame(a,index = [1,2,3],columns=['A','B','C','D'])
# print(b)

# import pandas as pd
# a = pd.DataFrame([[1,2],[3,4],[5,6]], columns =['date','score'] ,index= ['A','B','C'])
# a.index.name = '公司'
# a = a.rename(index={'A':'万科','B':'阿里','C':'百度'},columns={'date':'日期','score':'分数'})
# print(a)
# a = a.reset_index()
# print(a)
# a = a.set_index('日期')
# print(a)
'''
执行代码:
日期 分数
公司
万科 1 2
阿里 3 4
百度 5 6
公司 日期 分数
0 万科 1 2
1 阿里 3 4
2 百度 5 6
公司 分数
日期
1 万科 2
3 阿里 4
5 百度 6

进程已结束,退出代码0
'''

# import pandas as pd
# data = pd.read_excel('data.xlsx', sheet_name=0, encoding = 'utf-8')
# data = pd.read_csv('data.csv', delimiter=',', encoding='utf-8')

# import pandas as pd
# data = pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列','C列'])
# data.to_excel('data.xlsx')
# data.to_excel('data.xlsx', columns=['A列'], index = False) # 将data中的A列数据写入工作簿,并忽略行索引信息

# data = pd.DataFrame(np.arange(1,10).reshape(3,3), index=['r1','r2','r3'], columns=['C1','C2','C3'])
# print(data)

# a = data['C1']
# b = data[['C1']]
# c = data[['C1','C3']]
# print(a)
# print(b)
# print(c)
# a = data[1:3]
# b = data.iloc[1:3]
# print(a)
# print(b)
# c = data.iloc[-1]
# print(c)
# # d = data.iloc['r2','r3']
# # print(d)
# e = data.head()
# print(e)
'''
a = data[['c1', 'c3']][0:2]
b = data.iloc[0:2][['c1', 'c3']]
c = data.iloc[0]['c3']
d = data.loc[['r1','r2'],['c1','c3']]
e = data.iloc[0:2,[0,2]]
f = data.ix[0:2,['c1','c3']]


a = data[data['c1']> 1] # 选择c1列中数字大于1的行
b = data[(data['c1']>1)&(data['c2']==5)] # 筛选c1列中数字大于1且c2列中数字等于5的行
'''
'''
a = data.sort_values(by='c2',ascending=False) # 将data按c2列进行降序排列
a = a.sort_index() # 按行索引进行升序排列
data['c4'] = data['c3'] - data['c1'] # 通过数据运算可以基于已有的列生成新的一列:
a = data.drop(columns='c1') # 删除data中的c1列数据
b = data.drop(columns=['c1','c3']) # 删除C1和c3列的数据。删除多列数据时,要以列表的形式给出列索引
c = data.drop(columns=['r1','r3']) # 删除r1和r3行的数据。删除多行数据时,要以列表的形式给出行索引
# 将删除数据后的新DataFrame赋给新的变量,并不会改变原DataFrame(data)的结构,如果想改变原结构,可设置参数inplace为Ture
data.drop(index=['r1','r3'],inplace=True)
'''

'''
import pandas as pd
df1 = pd.DataFrame({'公司': ['恒盛', '创锐', '快学'], '分数': [90, 95, 85]})
df2 = pd.DataFrame({'公司': ['恒盛', '创锐', '惊喜'], '股价': [20, 180, 30]})
# print(df1)
# print(df2)
df3 = pd.merge(df1,df2) #
# print(df3)
df4 = pd.merge(df1,df2,on = '公司') # 通过设置参数on指定按照哪一列进行合并
df5 = pd.merge(df1,df2,how='outer') # 默认合并方式取交集(inner连接),如果想取并集(outer连接),可以设置how参数
df6 = pd.merge(df1,df2,how='left') # 想保留左表(df1)的内容,对右表(df2)内容不在意,可将how设置为‘left’
df7 = pd.merge(df1,df2,left_index=True,right_index=True) # 按照行索引进行合并,可以设置参数left_index和right_index

# df8 = pd.concat([df1,df2]) & df8 = pd.concat([df1,df2],axis=0) # 使用全连接(union all)完成拼接,不需要两个表有相同的列或索引,
# 只用axis指定连接轴向,该参数默认值为0,按行方向连接(纵向连接)
df9 = pd.concat([df1,df2],axis=1) # 按列方向连接,即横向连接,axis= 1
df10 = pd.concat([df1,df2],ignore_index=True) # 此时索引为两个表各自的索引,如想重置索引,可设置ignore_index为Ture来忽略原有索引,生成新的数字序列

df11 = df1.append(df2) # append()可以看成concat()函数的简化版,效果和pd.concat([df1,df2])类似,实现的也是纵向拼接
df12 = df1.append({'公司':'腾飞','分数':'90'},ignore_index=True) # 新增元素,一定要设置ignore_index为Ture来忽略原索引,否则会报错
print(df12)
'''
# import matplotlib.pyplot as plt # 必须是matplotlib.pyplot
# x = [1,2,3,4,5]
# y = [2,4,6,8,10]
# plt.bar(x,y) # 柱形图
# plt.plot(x,y) # 折线图
# plt.show()
'''
import xlwings as xw
import pandas as pd
app = xw.App(visible=False)
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(r'd:\table.xlsx')
workbook.close()
app.quit

import xlwings as xw
app = xw.App(visible=True, add_book = False)
for i in range(5):
workbook = app.books.add()
workbook.save(f'test{i}.xlsx')
workbook.close()
app.quit()
'''

# 批量打开一个文件夹下的所有工作簿
'''import os
import xlwings as xw
file_path = 'd:\\table'
file_list = os.listdir(file_path)
app = xw.App(visible=True, add_book= False) # 启动Excel程序
for i in file_list:
if os.path.splitext(i)[1] == '.xlsx' or os.path.splitext(i)[1] == '.xls':
app.books.open(file_path + '\\' + i)
'''
# listdir()函数用于返回指定路径下的文件夹包含的文件和子文件夹的名称列表
# splitext()函数用于分离文件主名和扩展名。

# 列出文件夹下所有文件和子文件夹的名称
'''
import os
file_path = 'd:\\work\\工作类'
file_list = os.listdir(file_path)
for i in file_list:
print(i)
'''
'''
# 批量重命名一个工作簿中的所有工作表
import xlwings as xw
app = xw.App(visible=False, add_book= False)
workbook = app.books.open('d:\\private\\tongjibiao.xlsx')
worksheets = workbook.sheets
for i in range(len(worksheets)):
worksheets[i].name = worksheets[i].name.replace('销售','') # 重命名工作表
workbook.save('d:\\private\\test.xlsx')
app.quit()

import os
file_path = ''
file_list = os.listdir(file_path)
old_book_name = '销售表'
new_book_name = '分部销售表'
for i in file_list:
if i.startswith('~$'):
continue
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)
'''
'''
import os
import xlwings as xw
file_path = 'e:\\table\信息表'
file_list = os.listdir(file_path)
old_sheet_name = 'Sheet1'
new_sheet_name = '员工信息'
app = xw.App(visible = False, add_book=False)
for i in file_list:
if i.startswith('~$'):
continue
old_file_path = os.path.join(file_path,i)
workbook = app.books.open(old_file_path)
for j in workbook.sheets:
if j.name == old_sheet_name:
j.name = new_sheet_name
workbook.save()
app.quit()
'''
'''
import os
import xlwings as xw
file_path = 'e:\\table\信息表'
file_list = os.listdir(file_path) # 列出文件夹下所有 文件和子文件夹的名称
sheet_name = '产品销售区域' # 给出要新增的工作表名称
app = xw.App(visible=False,add_book=False) #启动Excel程序
for i in file_list:
if i.startswith('~$'): # 判断是否有文件名为~$开头的
continue
file_paths = os.path.join(file_path,i) # 构造需要新增工作表的工作簿工作路径
workbook = app.books.open(file_paths) #根据路径打开需要新增工作表的工作簿
sheet_names = [j.name for j in workbook.sheets] # 获取打开的工作簿中所有工作表的名称
if sheet_names not in sheet_names:
workbook.sheets.add(sheet_names)
workbook.save()
app.quit()
'''
'''
# 删除工作表
import os
import xlwings as xw
file_path = '...'
file_list = os.listdir(file_path)
sheet_name = '产品销售区域' # 给出需要删除工作表名称
app = xw.App(visible = False,add_book=False)
for i in file_list:
continue
file_paths = os.path.join(file_path,i)
workbook = app.books.open(file_paths)
for j in workbook.sheets:
if j.name == sheet_name: #判断工作簿是否有名为“产品销售区域”的工作表
j.delete()
break
workbook.save()
app.quit()
'''
'''
# 打印多个工作簿
import os
import xlwings as xw
file_path = 'e:\\table\\表格'
file_list = os.list(file_path) # 文件夹下的所有文件和子文件
app = xw.App(visible = False, add_book = False) #
for i in file_list:
if i.startwith('~$'): # 是否以~¥开头
continue
file_paths = os.path.join(file_path,i) # 获取需要打印的文件路径
workbook = app.books.open(file_paths) # 打开要打印的工作簿
workbook.api.PrintOut() # PrintOut打印
app.quit()
'''
'''
# 批量打印指定工作表
import os
import xlwings as xw
file_path = 'e:\\table\\biaoge'
file_list = os.listdir(file_path)
sheet_name = 'fenlei'
app = xw.App(visible=False, add_book = False)
for i in file_list:
if i.startwith('~$'):
continue
file_paths = os.path.join(file_path,i)
workbook = app.books.open(file_paths)
for j in workbook.sheets:
if j.name == sheet_name:
j.api.PrintOut()
break
app.quit()
'''
'''
# 批量复制
import os
import xlwings as xw
app = xw.App(visible = False, add_book = False)
file_path = 'e:\\table\\biaoge'
file_list = os.listdir(file_path)
workbook = app.books.open('e:\\table\\xinxibiao')
worksheet = workbook.sheets
for i in file_list:
if os.path.splitext(i)[1] == 'xlsx':
workbooks = app.books.open(file_path+'\\'+i) # 如果是工作簿,则打开
for j in worksheet:
contents = j.range('A1').expand('table').value # 读取来源工作簿中要复制的工作表数据
name = j.name # 获取来源工作簿中的工作表名称
workbooks.sheets.add(name = name, after = len(workbooks.sheets)) # 在目标工作簿中新增同名工作表
workbooks.sheets[name].range('A1').value = contents # 将从来源工作簿中读取的工作表数据写入新增工作表
workbooks.save()
app.quit()
'''
'''
# 将某个工作表的数据批量复制到其他工作簿中的指定工作表中
import os
import xlwings as xw
app = xw.App(visible=False,add_book=False)
file_path = 'e:\\table\\chanpin.xlsx'
file_list = os.listdir(file_path)
workbook = app.books.open('e:\\table\\xinzeng.xslx')
value = worksheet.range('A1').expand('table') # 读取工作表‘新增产品’中的所有数据
start_cell = (2,1) #要复制数据的单元格区域的起始单元格
end_cell = (value.shape[0],value.shape[1]).value # 要复制的结束单元格
cell_area = worksheet.range(start_cell, end_cell)
for i in file_list:
if os.path.splitex(i)[1] =='xlsx':
try:
workbooks = xw.Book(file_path+'\\'+i)
sheet = workbooks.sheets['fenleibiao'] # 选中要粘贴数据的工作表
scope = sheet.range('A1').expand() # 选中要粘贴的单元格区域
sheet.range(scope.shape[0]+1,1).value = cell_area #粘贴数据
workbooks.save()
finally:
workbooks.close()
workbook.close()
app.quit()
'''
'''
按照条件将一个工作表拆分为多个工作簿
import ChatGPT_PyBot
import xlwings as xw
file_path = 'e:\\table\\*.xlsx' # 给出来源工作簿的文件路径
sheet_name = '统计表' # 要拆分的工作表名称
app = xw.App(visible=True, add_book=False) # 启动Excel程序
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] # 获取当前行的产品名称,作为数据的分类依据
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()
'''

'''
format用法
s1 = '{}今年{}岁'.format('小明',8) # 不设置拼接位置,按默认顺序拼接
s2 = '{1}今年{0}岁'.format(7,'小明') # 用数字序号指定拼接位置
s3 = '{name}今年{age}岁'.format(name = '小明', age = 7) # 用变量名指定拼接位置
'''

'''
# 按照条件将工作表拆分为多个工作表
import xlwings as xw
import pandas as pd
app = xw.App(visible=True, add_book=False)
workbook = app.books.open('e:\\table\\chanpin.xlsx')
worksheet = workbook.sheets['统计表']
# 读取要拆分的工作表数据
value = worksheet.range('A1').options(pd.DataFrame, headers = 1, index = False, expand = 'table')
data = value.groupby('产品名称') # 将数据按照产品名称分组
for idx, group in data:
new_worksheet = workbook.sheets.add(idx) # 在工作簿中新增工作表并命名为当前产品名称
new_worksheet['A1'].options(index = False).value = group # 将数据添加到新增的工作表
workbook.save()
workbook.close()
app.quit()
'''

'''
# 将多个工作表拆分为多个工作簿
import xlwings as xw
workbook_name = 'e:\\table\\产品表.xlsx'
app = xw.App(visible=True, add_book=False)
header = None
all_data = []
workbook = app.books.open(workbook_name)
for i in workbook.sheets:
workbook_split = app.books.add() # 新建一个目标工作簿
sheet_split = workbook_split.sheets[0] # 选择目标工作簿的第一个工作表
i.api.Copy(Before = sheet_split.api) # 将来源工作簿中的当前工作表复制到目标工作簿的第一个工作表之前
workbook_split.save('{}'.format(i.name)) # 以当前工作表的名称作为文件名保存的目标工作簿
app.quit()
'''

'''
# 批量合并多个工作簿的同名工作表
import os
import xlwings as xw
file_path = 'e:\\table\\统计' # 给出要合并工作表的所在文件夹路径
file_list = os.listdir(file_path) # 给出列表
sheet_name = '产品销售统计' # 给出要合并的同名工作表名称
app = xw.App(visible=True, add_book=False) # 启动Excel
header = None # 定义变量header,初始值为空对象,用于存放要合并工作表中数据的列标题
all_data = [] # 创建空列表
for i in file_list:
if i.startswith('~$'):
continue
file_paths = os.path.join(file_path, i) # 构造要合并的工作簿的文件路径
workbook = app.books.open(file_paths)
for j in workbook.sheets:
if j.name == sheet_name: #判断工作表的名称是否为’销售统计‘
if header == None: # 判断变量header是否已存放列标题
header = j['A1:I1'].value # 如果未存放,读取列表标题并赋给变量header
values = j['A2'].expand('table').value # 读取要合并的工作表中的数据
all_data = all_data + values # 合并多个工作簿中的同名工作表数据
new_workbook = xw.Book() # 新建工作簿
new_worksheet = new_workbook.sheets.add(sheet_name) # 在新建工作簿中新增名为“销售统计”的工作表
new_worksheet['A1'].value = header # 列标题
new_worksheet['A2'].value = all_data # 将要合并的工作表的数据复制到新增工作表
new_worksheet.autofit() # 根据合并后的数据内容,自动调整新增工作表的行高列宽
new_workbook.save('e:\\table\\上半年统计.xlsx') # 保存新建工作簿
app.quit()
'''
'''
import os
import xlwings as xw
workbook_name = 'e:\\table\caigou.xlsx'
sheet_names = [str(sheet)+'月' for sheet in range(1,7)] # 要合并的有规律的工作表名称
new_sheet_name = '上半年统计表' # 指定合并后新工作表名称
app = xw.App(visible=False, add_book=False)
header = None
all_data = []
workbook = app.books.open(workbook_name)
for i in workbook.sheets:
if new_sheet_name in i.name:
i.delete() # 如果已存在,则删除工作表
new_worksheet = workbook.sheets.add(new_sheet_name) # 新增一个名为“上半年统计表”的工作表
title_copied = False
for j in workbook.sheets:
if j.name in sheet_names:
if title_copied == False:
j['A1'].api.EntireRow.Copy(Destination = new_worksheet['A1'].api) # 要合并的工作表复制到新增的工作表
title_copied = True
row_num = new_worksheet['A1'].current_region.last_cell.row # 列出新增工作表含有数据的区域最后一行
j['A1'].current_region.offset(1,0).api.Copy(Destination = new_worksheet['A{}'.format(row_num + 1)].api)
# 在最后一行的下一行复制其他要合并的工作表数据,不复制列标题
new_worksheet.autofit()
workbook.save()
app.quit()
'''
'''
# 批量替换多个工作簿中的单元格数据
import os
import xlwings as xw
file_path = '分部信息'
file_list = os.listdir(file_path)
app = xw.App(visible = False, add_book = False)
for i in file_list:
if i.startswith('~$'):
continue
file_paths = os.path.join(file_path, i)
workbook = app.books.open(file_paths)
for j in workbook.sheets:
value = j['A2'].expand('table').value # 读取工作表数据
for index , val in enumerate(value):
if val[0] == '背包':
val[0] = '双肩包' # 替换为双肩包
value[index] = val # 替换整行数据
j['A2'].expand('table').value = value #完成替换的数据写入工作表
workbook.close()
app.quit()
'''
'''
# 批量修改多个工作簿中指定工作表的列数据

import os
import xlwings as xw
file_path = '分部信息'
file_list = os.listdir(file_path)
app = xw.App(viseble = False, add_book = False)
for i in file_list:
if i.startswith('~$'):
continue
file_paths = os.path.join(file_path, i)
workbook = app.books.open(file_paths)
worksheet = workbook.sheets['产品分类表'] # 指定要修改的工作表
value = worksheet['A2'].expand('table').value
for index, val in enumerate(value):
val[2] = val[2] * (1+0.04) # 将销售价上调0.04
value[index] = value # 替换整行数据
worksheet['A2'].expand('table').value = value # 将完成替换的数据写入工作表
workbook.save()
workbook.close()
app.quit()
'''