项目场景:
python数据处理,excel, pandas
问题描述
例如:当我们遇到上述表格,我们想把表格按照某一列来拆分为多张表,数据量少的时候可以简单的CTRL+C,但是当数据量很大的时候我们可以怎么操作呢?不妨用python来解决一下。
我们这里是按学院来拆分,将不同学院的同学拆分在不同的表中
代码展示:
import pandas as pd
data = pd.read_excel(r"C:\Users\Desktop\xs.xlsx")
rows = data.shape[0] #获取行数 shape[1]获取列数
department_list = []
for i in range(rows):
temp = data["学院"][i]
if temp not in department_list: #防止重复
department_list.append(temp) #将sheet_name的分类存在一个列表中
n = len(department_list) #类别数
#学院有几个类别这里就新建几个
for i in range(1,5):
locals()['df'+str(i)] = pd.DataFrame()
#要是类很多的话可以用local()的方法创建自变量
df_list = [df1,df2,df3,df4,df5]
for department in range(n):
for i in range (0, rows):
if data["学院"][i] == department_list[department]:
df_list[department] = pd.concat([df_list[department], data.iloc[[i],:]], axis = 0, ignore_index = True)
writer = pd.ExcelWriter(r'C:\Users\Desktop\各学院学生.xlsx') #利用pd.ExcelWriter()存多张sheets
for i in range(n):
df_list[i].to_excel(writer, sheet_name = str(department_list[i]), index=False) #注意加上index=FALSE 去掉index列
writer.save()
动态生成变量:
用Python循环创建多个变量, 如创建 a1= 、a2= 、a3= 、a4= 、a5= 或 self.a1= 、self.a2= 、 self.a3=
一. 可以通过python的内置函数locals 来完成
locals是python的内置函数,他可以以字典的方式去访问局部和全局变量。
python里面用名字空间记录着变量,就像javascript的window一样,他记录着各种全局变量。
每个模块,每个函数都有自己的名字空间,记录着变量,常量,类的命名和值。
1 createVar = locals()
2 listTemp = range(1,10)
3 for i,s in enumerate(listTemp):
4 createVar['a'+i] = s
5 print a1,a2,a3
二. 对于class,推荐使用setattr()方法
1 class test(object) :
2 def __init__(self):
3 dic={'a':'aa','b':'bb'}
4 for i in dic.keys() :
5 setattr(self,i,dic[i]) #第一个参数是对象,这里的self其实就是test.第二个参数是变量名,第三个是变量值
6 print(self.a)
7 print(self.b)
8 t=test()
结果展示:
如果想进一步把sheet拆为不同的excel表,可以用宏来完成
用常规的一步步操作大家都知道吧,但工作表一多,工作量是很大的,也就变成不现实了。用宏来解决,将每个工作表导出到这个文件的同名文件夹下。
右键任意一个sheet,点击代码,将下面代码复制到代码框,运行就可以实现啦。
Sub SaveAllSheet()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim TPath As String, XSheet As Worksheet
TPath = ActiveWorkbook.Path
For Each XSheet In ActiveWorkbook.Sheets
XSheet.Copy
ActiveWorkbook.SaveAs Filename:=TPath & “” & ActiveSheet.Name & “.xls”
ActiveWindow.Close
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub