【Python】对Excel数据进行批量操作

前言:

因为博主所在的地方,需要每周整理全校的青年大学习数据,Excel操作本身不难,但是这种毫无意义的体力劳动做久了就会很无趣,刚好我想起来上学期接触过PythonPandas模块,想着能不能试一下,取代这种无意义的劳动。

所用工具:
Pycharm 3.8(Python也可以)
Excel
Pandas库
Xlwt库

主要流程:

在这里插入图片描述

每周老师会发1M左右大小的.csv文件下来。
1.需要筛选出每个院有多少人看了。
2.再把每个院的团员数量填进去。
3.(每个院看了的人数)/(每个院的团员人数)=每个院的参与率
4.最底行再统计总人数和总参与率
这里城镇对应了学院
在这里插入图片描述
这是最终要的表格形式,此图的团员数量是后期调试方便随便输入的。本身操作不难,但每周总是得花点时间才能做完。

代码操作

之前上网查资料时,很多博主提醒打开文件的编码模式一定得是gbk,但我第一次的文件只能用UTF-8打开,但之后也有得用gbk才能打开的文件,这算是我踩过坑,大家知道就好。

#首先导入模块
import pandas as pd
import xlwt

#导入文件 
data = pd.read_csv(r'C:\Users\ASUS\Desktop\第九季第十三期源数据.csv', encoding = "gbk",error_bad_lines=False) #导入文件 encoding = 'UTF-8'
#筛选“城镇”列
data_gender = data[[ '城镇']] 
#删掉用不到的列
data_gender_re = data_gender[data_gender.notnull()] #删掉无用项

每周的团员数量都是在变化的,所以我决定用输入的方式来确定这个量

#这里定义了一个函数,用户输入每周的团员数量
def getdata():
    liebiao1 = []
    liebiao1.append(int(input("A院团员人数:")))
    liebiao1.append(int(input("B院团员人数:")))
    liebiao1.append(int(input("C院团员人数:")))
    liebiao1.append(int(input("D院团员人数:")))
    liebiao1.append(int(input("E院团员人数:")))
    liebiao1.append(int(input("F院团员人数:")))
    liebiao1.append(int(input("G院团员人数:")))
    liebiao1.append(int(input("H院团员人数:")))
    liebiao1.append(int(input("I院团员人数:")))
    liebiao1.append(int(input("J团员人数:")))
    liebiao1.append(int(input("K院团员人数:")))
    liebiao1.append(int(input("L院团员人数:")))
    liebiao1.append(int(input("M院团员人数:")))
    liebiao1.append(int(input("N院团员人数:")))
    liebiao1.append(int(input("O学院团员人数:")))
    liebiao1.append(int(input("P院团员人数:")))
    liebiao1.append(int(input("Q院团员人数:")))

    return liebiao1

对“城镇”列的数据进行筛选,,将收集的数据传递给a(字典类型)
例如:a1={A:34} ,其中A是学院名称,34是数量

def screendata():
    F1 = data_gender_re.loc[(data_gender_re['城镇'] == 'A学院团委')]
    F2 = data_gender_re.loc[(data_gender_re['城镇'] == 'B工程学院团委')]
    F3 = data_gender_re.loc[(data_gender_re['城镇'] == 'C学院团委')]
    F4 = data_gender_re.loc[(data_gender_re['城镇'] == 'D学院团委')]
    F5 = data_gender_re.loc[(data_gender_re['城镇'] == 'E学院团委')]
    F6 = data_gender_re.loc[(data_gender_re['城镇'] == 'F学院团委')]
    F7 = data_gender_re.loc[(data_gender_re['城镇'] == 'G学院团委')]
    F8 = data_gender_re.loc[(data_gender_re['城镇'] == 'H学院团委')]
    F9 = data_gender_re.loc[(data_gender_re['城镇'] == 'I学院团委')]
    F10 = data_gender_re.loc[(data_gender_re['城镇'] == 'J学院团委')]
    F11 = data_gender_re.loc[(data_gender_re['城镇'] == 'K学院团委')]
    F12 = data_gender_re.loc[(data_gender_re['城镇'] == 'L学院团委')]
    F13 = data_gender_re.loc[(data_gender_re['城镇'] == 'M学院团委')]
    F14 = data_gender_re.loc[(data_gender_re['城镇'] == 'N学院团委')]
    F15 = data_gender_re.loc[(data_gender_re['城镇'] == 'O学院团委')]
    F16 = data_gender_re.loc[(data_gender_re['城镇'] == 'P学院团委')]
    F17 = data_gender_re.loc[(data_gender_re['城镇'] == 'Q学院团委')]

#将字典a的信息传递给列表b
    # A
    a1 = dict(F1['城镇'].value_counts())
    b1 = [list(a1) + list(a1.values())]

    # B
    a2 = dict(F2['城镇'].value_counts())
    b2 = [list(a2) + list(a2.values())]

    # C
    a3 = dict(F3['城镇'].value_counts())
    b3 = [list(a3) + list(a3.values())]

    # D
    a4 = dict(F4['城镇'].value_counts())
    b4 = [list(a4) + list(a4.values())]

    # E
    a5 = dict(F5['城镇'].value_counts())
    b5 = [list(a5) + list(a5.values())]

    # F
    a6 = dict(F6['城镇'].value_counts())
    b6 = [list(a6) + list(a6.values())]

    # G
    a7 = dict(F7['城镇'].value_counts())
    b7 = [list(a7) + list(a7.values())]

    # H
    a8 = dict(F8['城镇'].value_counts())
    b8 = [list(a8) + list(a8.values())]

    # I
    a9 = dict(F9['城镇'].value_counts())
    b9 = [list(a9) + list(a9.values())]

    # J
    a10 = dict(F10['城镇'].value_counts())
    b10 = [list(a10) + list(a10.values())]

    # K
    a11 = dict(F11['城镇'].value_counts())
    b11 = [list(a11) + list(a11.values())]

    # L
    a12 = dict(F12['城镇'].value_counts())
    b12 = [list(a12) + list(a12.values())]

    # M
    a13 = dict(F13['城镇'].value_counts())
    b13 = [list(a13) + list(a13.values())]

    # N
    a14 = dict(F14['城镇'].value_counts())
    b14 = [list(a14) + list(a14.values())]

    # O
    a15 = dict(F15['城镇'].value_counts())
    b15 = [list(a15) + list(a15.values())]

    # P
    a16 = dict(F16['城镇'].value_counts())
    b16 = [list(a16) + list(a16.values())]

    # Q
    a17 = dict(F17['城镇'].value_counts())
    b17 = [list(a17) + list(a17.values())]

    #将列表b合并,此时data1是二维列表
    data1 = b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9 + b10 + b11 + b12 + b13 + b14 + b15 + b16 + b17
    data2 = b1[0][1] + b2[0][1] + b3 [0][1] + b4 [0][1] + b5 [0][1] + b6 [0][1] + b7 [0][1] + b8 [0][1] + b9 [0][1] + b10 [0][1] + b11 [0][1] + b12 [0][1] + b13 [0][1] + b14 [0][1] + b15 [0][1] + b16 [0][1] + b17 [0][1]

	#下面俩是上面表格中的最底下两行,不参与计数,以要求的形式存在
    data1.append([])
    data1.append(['总计',data2])

    return data1

执行函数,将getdata返回的值给disanlie(第三列)

screendata()

disanlie = getdata()

将两个列表合并在一起(列与列的合并)

screendata1 = [list(screendata()[i]) + [disanlie[i]] for i in range(len(screendata())-2)]

计算出每个学院的参与率disilie(第四列,这里老师要求是百分比,且保留小数点后一位,后面会讲到)

disilie = []
for i in range(17):
    disilie.append((float(screendata1[i][1])/(screendata1[i][2])))

将参与率disilie与上面整理的总表格合并(也是列与列的合并)

screendata2 = [list(screendata1[i]) + [disilie[i]] for i in range(len(screendata1))]

表格里的最后一行:参与人数总和、团员人数总和、总参与比,这里没什么好说的,注意数据别带错,简单的运算

canyurenshu = 0;tuanyuanrenshu = 0
for i in range(17):
    canyurenshu = screendata2[i][1] + canyurenshu
    tuanyuanrenshu = screendata2[i][2] + tuanyuanrenshu
canyubi1 = (canyurenshu / tuanyuanrenshu)
float(canyubi1)
#老师要求总参与比为百分比,且小数点后两位(百分比后面再处理)
canyubi = ("%.2f%%"  %(canyubi1*100))

表格中倒数第二行是空的,所以准备一个空列表,并将之前算好的数据全装进第二个列表。

zongjie1 = []
zongjie2 = ['总计',canyurenshu,tuanyuanrenshu,canyubi]

然后将上面准备好的最底两行与总表格合并

screendata2.append(zongjie1)
screendata2.append(zongjie2)

老师还要求(我内心其实是崩溃的~)学院按参与率由高到低排序,我这里采用了sorted函数,用key关键字进行排序,非常方便

screendata3=[]
for i in range(17):
    screendata3.append(screendata2[i])


screendata4 = sorted(screendata3,key=lambda x: x[3],reverse=True)

#这里将学院的参与率由float型转为小数点后一位的百分比
for i in range(17):
    screendata4[i][3] = str("%.1f" % (screendata4[i][3]*100)) + '%'


screendata4.append(zongjie1)
screendata4.append(zongjie2)

最后生成Excel文件,大功告成

#pd.DataFrame(列表,每一列的列头)
df = pd.DataFrame(screendata4, columns=['学院','参与人数','团员人数','参与比'])


df.to_excel(r'C:\Users\ASUS\Desktop\导出文件.xls',index=False,encoding = 'UTF-8')

第一次写这么长的博客,写的不好,代码太乱也没有整理,将就看着,下面写下一些我遇到的坑。

1.到后面已经可以生成文件了,如果Excel还开着,就Run程序,这个肯定会报错
2.编码问题,有些时候UTF-8才能运行,有时候gbk才能运行,不过基本上都是gbk才能运行
3.列表的行数、列数,思考调试列表的位置把我弄傻了都…
4.pd.DataFrame函数的columns是以一个列表的形式出现。你传入的列表数有n列,那么columns列表的元素就不能超过n
5.如果你保存的是.csv格式,那么你的小数点后一位的百分比格式,生成为.csv的时候,会自动给你多保留一位小数点,于是乎我才选择导入xlwt模块生成Excel文件

目前就想到这么多,欢迎补充~

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用 Apache POI 库来实现批量导出数据Excel 文件。下面是一个简单的示例代码,假设我们要将一个学生列表导出到 Excel 文件: ```java import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportToExcel { public static void export(List<Student> students, String filePath) { // 创建 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建 Excel 表格 XSSFSheet sheet = workbook.createSheet("学生列表"); // 创建表头 Row headerRow = sheet.createRow(0); Cell headerCell1 = headerRow.createCell(0); headerCell1.setCellValue("姓名"); Cell headerCell2 = headerRow.createCell(1); headerCell2.setCellValue("年龄"); Cell headerCell3 = headerRow.createCell(2); headerCell3.setCellValue("成绩"); // 填充数据 int rowIndex = 1; for (Student student : students) { Row row = sheet.createRow(rowIndex++); // 姓名 Cell cell1 = row.createCell(0); cell1.setCellValue(student.getName()); // 年龄 Cell cell2 = row.createCell(1); cell2.setCellValue(student.getAge()); // 成绩 Cell cell3 = row.createCell(2); cell3.setCellValue(student.getScore()); } // 导出文件 try (FileOutputStream outputStream = new FileOutputStream(filePath)) { workbook.write(outputStream); System.out.println("导出成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们通过 `XSSFWorkbook` 类创建了一个 Excel 工作簿,然后通过 `workbook.createSheet` 方法创建了一个 Excel 表格。接着,我们创建了表头,并通过循环遍历学生列表将数据填充到表格中。最后,我们使用 `FileOutputStream` 将 Excel 文件导出到指定的路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值