VBA处理数据与Python Pandas处理数据案例比较

Author : Collin_PXY

需求:

现有一个 csv文件,包含'CNUM'和'COMPANY'两列,数据里包含空行,且有内容重复的行数据。

要求:

1)去掉空行;

2)重复行数据只保留一行有效数据;

3)修改'COMPANY'列的名称为'Company_New‘;

4)并在其后增加六列,分别为'C_col','D_col','E_col','F_col','G_col','H_col'。

一,使用 Python Pandas来处理:

  1. import pandas as pd
  2. import numpy as np
  3. from pandas import DataFrame,Series
  4. def deal_with_data(filepath,newpath):
  5. file_obj=open(filepath)
  6. df=pd.read_csv(file_obj) # 读取csv文件,创建 DataFrame
  7. df=df.reindex(columns=['CNUM','COMPANY','C_col','D_col','E_col','F_col','G_col','H_col'],fill_value=None) # 重新指定列索引
  8. df.rename(columns={'COMPANY':'Company_New'}, inplace = True) # 修改列名
  9. df=df.dropna(axis=0,how='all') # 去除 NAN 即文件中的空行
  10. df['CNUM'] = df['CNUM'].astype('int32') # 将 CNUM 列的数据类型指定为 int32
  11. df = df.drop_duplicates(subset=['CNUM', 'Company_New'], keep='first') # 去除重复行
  12. df.to_csv(newpath,index=False,encoding='GBK')
  13. file_obj.close()
  14. if __name__=='__main__':
  15. file_path=r'C:\Users\12078\Desktop\python\CNUM_COMPANY.csv'
  16. file_save_path=r'C:\Users\12078\Desktop\python\CNUM_COMPANY_OUTPUT.csv'
  17. deal_with_data(file_path,file_save_path)

二,使用 VBA来处理:

  1. Option Base 1
  2. Option Explicit
  3. Sub main()
  4. On Error GoTo error_handling
  5. Dim wb As Workbook
  6. Dim wb_out As Workbook
  7. Dim sht As Worksheet
  8. Dim sht_out As Worksheet
  9. Dim rng As Range
  10. Dim usedrows As Byte
  11. Dim usedrows_out As Byte
  12. Dim dict_cnum_company As Object
  13. Dim str_file_path As String
  14. Dim str_new_file_path As String
  15. 'assign values to variables:
  16. str_file_path = "C:\Users\12078\Desktop\Python\CNUM_COMPANY.csv"
  17. str_new_file_path = "C:\Users\12078\Desktop\Python\CNUM_COMPANY_OUTPUT.csv"
  18. Set wb = checkAndAttachWorkbook(str_file_path)
  19. Set sht = wb.Worksheets("CNUM_COMPANY")
  20. Set wb_out = Workbooks.Add
  21. wb_out.SaveAs str_new_file_path, xlCSV 'create a csv file
  22. Set sht_out = wb_out.Worksheets("CNUM_COMPANY_OUTPUT")
  23. Set dict_cnum_company = CreateObject("Scripting.Dictionary")
  24. usedrows = WorksheetFunction.Max(getLastValidRow(sht, "A"), getLastValidRow(sht, "B"))
  25. 'rename the header 'COMPANY' to 'Company_New',remove blank & duplicate lines/rows.
  26. Dim cnum_company As String
  27. cnum_company = ""
  28. For Each rng In sht.Range("A1", "A" & usedrows)
  29. If VBA.Trim(rng.Offset(0, 1).Value) = "COMPANY" Then
  30. rng.Offset(0, 1).Value = "Company_New"
  31. End If
  32. cnum_company = rng.Value & "-" & rng.Offset(0, 1).Value
  33. If VBA.Trim(cnum_company) <> "-" And Not dict_cnum_company.Exists(rng.Value & "-" & rng.Offset(0, 1).Value) Then
  34. dict_cnum_company.Add rng.Value & "-" & rng.Offset(0, 1).Value, ""
  35. End If
  36. Next rng
  37. 'loop the keys of dict split the keyes by '-' into cnum array and company array.
  38. Dim index_dict As Byte
  39. Dim arr_cnum()
  40. Dim arr_Company()
  41. For index_dict = 0 To UBound(dict_cnum_company.keys)
  42. ReDim Preserve arr_cnum(1 To UBound(dict_cnum_company.keys) + 1)
  43. ReDim Preserve arr_Company(1 To UBound(dict_cnum_company.keys) + 1)
  44. arr_cnum(index_dict + 1) = Split(dict_cnum_company.keys()(index_dict), "-")(0)
  45. arr_Company(index_dict + 1) = Split(dict_cnum_company.keys()(index_dict), "-")(1)
  46. Debug.Print index_dict
  47. Next
  48. 'assigns the value of the arrays to the celles.
  49. sht_out.Range("A1", "A" & UBound(arr_cnum)) = Application.WorksheetFunction.Transpose(arr_cnum)
  50. sht_out.Range("B1", "B" & UBound(arr_Company)) = Application.WorksheetFunction.Transpose(arr_Company)
  51. 'add 6 columns to output csv file:
  52. Dim arr_columns() As Variant
  53. arr_columns = Array("C_col", "D_col", "E_col", "F_col", "G_col", "H_col") '
  54. sht_out.Range("C1:H1") = arr_columns
  55. Call checkAndCloseWorkbook(str_file_path, False)
  56. Call checkAndCloseWorkbook(str_new_file_path, True)
  57. Exit Sub
  58. error_handling:
  59. Call checkAndCloseWorkbook(str_file_path, False)
  60. Call checkAndCloseWorkbook(str_new_file_path, False)
  61. End Sub
  62. ' 辅助函数:
  63. 'Get last row of Column N in a Worksheet
  64. Function getLastValidRow(in_ws As Worksheet, in_col As String)
  65. getLastValidRow = in_ws.Cells(in_ws.Rows.count, in_col).End(xlUp).Row
  66. End Function
  67. Function checkAndAttachWorkbook(in_wb_path As String) As Workbook
  68. Dim wb As Workbook
  69. Dim mywb As String
  70. mywb = in_wb_path
  71. For Each wb In Workbooks
  72. If LCase(wb.FullName) = LCase(mywb) Then
  73. Set checkAndAttachWorkbook = wb
  74. Exit Function
  75. End If
  76. Next
  77. Set wb = Workbooks.Open(in_wb_path, UpdateLinks:=0)
  78. Set checkAndAttachWorkbook = wb
  79. End Function
  80. Function checkAndCloseWorkbook(in_wb_path As String, in_saved As Boolean)
  81. Dim wb As Workbook
  82. Dim mywb As String
  83. mywb = in_wb_path
  84. For Each wb In Workbooks
  85. If LCase(wb.FullName) = LCase(mywb) Then
  86. wb.Close savechanges:=in_saved
  87. Exit Function
  88. End If
  89. Next
  90. End Function

三,输出结果:

两种方法输出结果相同:

四,比较总结:

Python pandas 内置了大量处理数据的方法,我们不需要重复造轮子,用起来很方便,代码简洁的多。

Excel VBA 处理这个需求,使用了 数组,字典等数据结构(实际需求中,数据量往往很大,所以一些地方没有直接使用遍历单元格的方法),以及处理字符串,数组和字典的很多方法,对文件的操作也很复杂,一旦出错,调试起来比python也较困难,代码已经尽量优化,但还是远比 Python要多。

Pandas_VBA_数据清洗对比的更多相关文章

  1. [数据清洗]- Pandas 清洗“脏”数据(二)

    概要 了解数据 分析数据问题 清洗数据 整合代码 了解数据 在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的.我们尝试去理解数据的列/行.记录.数据格式.语义错误.缺失的条目以及错误的 ...

  2. ETL实践--Spark做数据清洗

    ETL实践--Spark做数据清洗 上篇博客,说的是用hive代替kettle的表关联.是为了提高效率. 本文要说的spark就不光是为了效率的问题. 1.用spark的原因 (如果是一个sql能搞定 ...

  3. Python、R对比分析

    一.Python与R功能对比分析 1.python与R相比速度要快.python可以直接处理上G的数据:R不行,R分析数据时需要先通过数据库把大数据转化为小数据(通过groupby)才能交给R做分析, ...

  4. Elasticsearch的几种架构(ELK,EL,EF)性能对比测试报告

    Elasticsearch的几种架构性能对比测试报告 1.前言 选定了Elasticsearch作为存储的数据库,但是还需要对Elasticsearch的基础架构做一定测试,所以,将研究测试报告输出如 ...

  5. 用Python进行数据清洗,这7种方法你一定要掌握

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者 | 常国珍.赵仁乾.张秋剑 来源 |<Python数据科学:技术 ...

  6. Flashtext:大规模数据清洗的利器

    Flashtext:大规模数据清洗的利器 在这篇文章中,我们将介绍一种新的关键字搜索和替换的算法:Flashtext 算法.Flashtext 算法是一个高效的字符搜索和替换算法.该算法的时间复杂度不 ...

  7. MapReduce08 数据清洗(ETL)和压缩

    目录 数据清洗(ETL) ETL清洗案例 需求 需求分析 实现代码 编写WebLogMapper类 编写WebLogDriver类 打包到集群运行 压缩 概念 MR支持的压缩编码 压缩算法对比 压缩性 ...

  8. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  9. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

随机推荐

  1. 极简 Node.js 入门 - 4.5 双工流

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  2. HanLP的分词统计

    HanLP的分词效果鄙人研究了HanLP,他的分词效果确实还可以,而且速度也比较快,10的数据是9000毫秒 @SneakyThrows@Overridepublic LinkedHashMap< ...

  3. [tip:,x86/urgent] x86: Fix early boot crash on gcc-10, third try

    [tip:,x86/urgent] x86: Fix early boot crash on gcc-10, third try   https://lore.kernel.org/patchwork ...

  4. Apache Jmeter 性能测试

    今天在写性能测试报告的时候需要使用到数据,打算用做一下性能测试,然后在百度后发现了一款Apache开源的Jmeter压测工具 Jmeter概述: Apache JMeter是一款纯java编写负载功能 ...

  5. HTML常用标签(下)

    HTML常用标签(下) 1. 表格标签 1.1 语法 <table> <!--table定义表格--> <tr> <!--tr定义表格中的行--> &l ...

  6. 【Curl】【转】curl用法!

    curl基础用法! www.ruanyifeng.com/blog/2019/09/curl-reference.html

  7. 【嵌入式】C语言高级编程▁▁▁嵌入式C语言入门编程学习!

    ✍  1.C 语言标准 什么是 C 语言标准呢? 我们生活的现实世界,就是由各种标准构成的,正是这些标准,我们的社会才会有条不紊的运行. 比如我们过马路,遵循的交通规则就是一个标准:红灯停,绿灯行,黄 ...

  8. lvs搭建dr负载均衡集群

    一,查看本地centos的版本: [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ...

  9. win8怎样才能启用administrator登录 别的用户也是如此

    但是你可以用命令调出administrator账户打开C盘,打开windows文件夹,再打开system32文件夹,找到cmd.exe右键点击选择以管理员身份运行 在里面输入net user admi ...

  10. Linux配置阿里epl源

    去阿里云 有源仓库 阿里云镜像官方站点 https://developer.aliyun.com/mirror/ 先备份本机上的源 mv /etc/yum.repos.d/CentOS-Base.re ...