首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用编程赋能工作系列——解锁合并单元格问题

用编程赋能工作系列——解锁合并单元格问题

作者头像
数据小磨坊
发布2020-02-25 11:36:57
6700
发布2020-02-25 11:36:57
举报
文章被收录于专栏:数据小魔方数据小魔方

能把学习的编程技能用在实际工作中,提升效率、解决痛点、释放生产力,个人觉得是学习编程技能ROI最高的回报,而非都要挤破头成为数据科学家、算法工程师,毕竟这些职业的门槛一直都在,但让工作更轻松却是任何一个职业都有的真实诉求。

疫情这段时间以来,闭门思考了很多事情,其中就包括对于本公众号的定位以及发展方向,之后我会单列一篇详细的内容分享。

沉寂了这么久,着实对不起一路以来一直都不离不弃一直关注者本号的小伙伴儿,过往自己太醉心于技术,总想尝试着突破、创造、标新立异。认真复盘以来,还是觉得应该脚踏实地苦练基本功,心浮气躁终究很难成事(毕竟鲜花与掌声是不常有的,而柴米油盐却是常态)。

所以打算从20年初开始,公众号新开一个栏目,定位是职场办公主题(毕竟已经从校园进入职场两年多了),解决大家日常工作中那些操作繁琐、希望通过编程手段来流程化、系统化、自动化的工作痛点和难题。

我会从自己实际工作中遇到的繁琐难题入手,分别给出编程实现思路,在巩固自己语法基础的同时,也希望可以帮到那些有心学习编程技能来赋能职业发展的小伙伴儿。

同时也非常欢迎小伙伴儿们贡献出自己实际工作遇到的难题和痛点,可以通过公众号回复或者私信的形式发给我,如果遇到共性的问题,我会统一给出实现方案。

>>>>

以下是学习时间


新栏目开篇是最近遇到的一个小case,场景如下图所示,不太好用文字描述这个功能叫啥,索性就叫做解锁合并单元格吧。

这种情况,相信在很多包含非结构化数据的汇总分析中经常遇到,如果不把表格中右侧合并在单元格中的多行内容汇总到单行单元格中(如图右半部分所示的理想情况),那么要想做全局性的汇总统计分析工作就很困难。

以上诉求在Excel中是很难得到解决,但是如果对R语言和Python稍有基础的话,那么就很轻松可以解决,整体思路如下:

1、先用一个循环遍历每一行

2、把每一行内容,根据右侧单元格中文本的长度改造成单个数据框(表格)

3、把所有行遍历并改造后的数据框(表格)依次纵向拼成一个新数据框

整体思路很简单,以下给出在R语言和Python中的代码实现,结尾再划重点。

R中实现方案

library('openxlsx')
dt1 <- read.table(pipe("pbpaste"), sep="\t", header=T,stringsAsFactors =FALSE,check.names = FALSE)
my_fun <- function(){
tegart_data <- data.frame(
  id = numeric(),  
  客户来源 = character(),  
  收入类型 = character(),   
  stringsAsFactors=FALSE  
  ) # 建立空表,作为装结果数据的初始容器
  for(i in 1:nrow(dt1)) {
      if(nchar(dt1$收入类型[i]) != 0){
            temp <- data.frame(
                    id = row.names(dt1)[i],
                    客户来源 = dt1[i,1], 
                    收入类型 = strsplit(dt1$收入类型[i],'\n')[[1]] # Excel单元格中换行,可以用换行符作为切割分隔符 
                     )      
             tegart_data <- rbind(tegart_data,temp)
             }
       }  
        return(tegart_data)
   }
   my_data <- my_fun()
   write.xlsx(my_data,"/Users/duyu/Desktop/mydata.xlsx",sheetName="sheet",append=TRUE)

Python实现方案

import os
import pandas as pd
import numpy as np
import refrom openpyxl 
import load_workbook
os.chdir("/Users/duyu/Desktop/")
mydata_excel = pd.read_excel('mydata.xlsx',sheet_name = 'data',sep = '\t',encoding = 'utf-8')
def my_fun():
    tegart_data = pd.DataFrame(columns = ["id", "来源", "收入类型"])
        for i in range(len(mydata_excel)):
            if  isinstance(mydata_excel.loc[i,'收入类型'],str):
                j = len(re.split(r'\n',mydata_excel.loc[i,"收入类型"])) 
                temp = pd.DataFrame(
                      {
                        "id":[i] * j,
                        "客户类型":[mydata_excel.loc[i,"客户类型"]] * j,
                        "收入类型":re.split(r'\n',mydata_excel.loc[i,"收入类型"]) 
                          }
                     ) # 建空表,作为接收结果数据的初始化容器
             tegart_data = pd.concat([tegart_data,temp])
      return tegart_data
 
 if __name__ == '__main__':
     my_data = my_fun()
     writer = pd.ExcelWriter('wookbook1.xlsx')           #新建或者已存在本地的目标工作簿    
     my_data.to_excel(writer, sheet_name='sheet1')       #插入想要保存的第一个sheet数据(如果有多个表依次插入即可)
     writer.save()     # 直接使用pandas里面的to_excel会导致重写目标表(原有内容会丢失),这里找打了可以追加式插入数据的方式

敲黑板,划重点:


>>>>

R语言和Python中的标量

R语言中无所谓标量和向量,一切均是向量,标量就是长度为1的向量,所以在改造每一个新数据框的时候,R代码中针对左侧字段的长度补充是直接赋值标量的形式,因为最终这个数据框的行长度是由构造向量的最长长度决定的,右侧文本切割之后得到的结果向量最长,所以左侧标量对应对应复制几次,使得所有向量等长,构成一个合法数据框。Python中标量和列表(这里当成向量来对待)严格区别,所以在构造数据框中,我将左侧标量封装成一个列表,并复制成长度为j的列表(j等于右侧文本分割后的列表长度)。

每篇只讲一个知识点,解决一个工作中的小窍门,相信日积月累你的问题解决能力会日益提升。在这个疫情还未平息,闭门憋出内伤的时间里,学习绝对能让你充实,也许疫情结束了,你会突然惊讶,卧槽我的编程是什么时候变得的这么熟练的!

如果你还没有接触过R语言和Python,要是时间允许,可以尝试着入坑,相信我,这些绝对是大数据时代代表着水电煤的基础设施能力。

还是那句话,不求一定要成为数据科学家、AI工程师、算法工程师,能让你的职场工作更高效,留些时间多陪陪父母和孩子、陪陪伴侣和朋友,不要在枯燥繁琐的工作中一筹莫展、泥足深陷,学会借力、借势,让工具赋能工作,同时也赋能人生。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档