针对Excel数据某字段符合条件的内容,修改另外一个字段对应的数值(R与Python对比)

针对Excel数据某字段符合条件的内容,修改另外一个字段对应的数值(R与Python对比)

还是工作上遇到的问题,做Excel的“表哥”做了这么久,才试着用R和Python来提升效率,说来真惭愧,但是一旦接触了就好像打开了潘多拉的盒子,一发不可收拾(希望真的是这样,坚持下去。。。)

好了,废话不说。现在工作上遇到的一个问题背景是这样的:因为商品的ID与单价,需要根据最新的情况来修改,过去都是在excel上筛选出来再vlookup来做,做完还得重新算其他相关列的数据。
以下是用R和Python来实现这样的需求,直接上代码和注释。
(总结:对比下来,R的运行效率高太多了,可能是专门对excel这种数据的关系,或者是本人对Python功力低下的原因,如果有高人指点改进改进,随时欢迎!!!)

先来R 的:

#R语言脚本
#安装用到的包
#install.packages("sqldf") 
#devtools::install_github(c("ramnathv/htmlwidgets", "smartinsightsfromdata/rpivotTable")) 
#install.packages("plyr")
library(xlsx)  #常规的写xlsx的库,但是对比openxlsx效率欠佳
library(readxl) #常规的读readxl的库,效率比openxlsx快,但是有的字段格式出错
library(reshape2)  #一些透视功能的函数依赖的库,如melt acast  dcast 等
library(plyr)     
library(rpivotTable)   #github上开源的专门数据透视的可视化的库,效果如excel的数据透视
library(openxlsx)   #导入导出xlsx效率高,且格式正确
library(sqldf)       #sql语句的库,能对数据框进行有效的sql语句
 

data1=data.frame(read.xlsx('C:/Users/lenovo/Desktop/数据源.xlsx',sheet='Sheet1'))
data2=as.data.frame(read.xlsx('C:\\Users\\lenovo\\Desktop\\CPA\\单价列表.xlsx',sheet='Sheet1'))

##以下是针对需要变动的应用单价进行修改
for(i in 1:length(data2$ID)){
  ai=which(data1$ID==data2$ID[i])
  if(length(ai>0)){
    data1$单价[ai]=data2$实际价格[i]
    data1$税前收入=data1$激活数*data1$单价
    data1$税后收入=data1$税前收/1.06
    data1$AA税后收入  =data1$税后收入*data1$AA下载用户数占比
    data1$BB税后收入  =data1$税后收入*data1$BB下载用户数占比
    data1$CC税后收入  =data1$税后收入*data1$CC下载用户数占比
    data1$单下载量价值 =data1$税前收入/data1$下载量
    }
  }

month_sum=sqldf('select 月份, sum(税后收入) from data1 group by 月份')
colnames(month_sum)=iconv(colnames(month_sum),'UTF-8','GBK')#把字段名称转化为GBK编码,否则乱码

day_sum  =sqldf('select 日期, sum(税后收入) from data1 group by 日期')
colnames(day_sum)=iconv(colnames(day_sum),'UTF-8','GBK')  #把字段名称转化为GBK编码,否则乱码

sheets=list("数据源"=data1,"月汇总"=month_sum,"日汇总"=day_sum)   #新建工作簿列表
write.xlsx(sheets,'C:/Users/lenovo/Desktop/修正版.xlsx') #这个是用openxlsx,效率较快

#a=as.data.frame(read_excel('C:/Users/lenovo/Desktop/数据源.xlsx',sheet='Sheet1'))
#typeof(a)

# selectresult=subset(data1,select=c(月份,日期,税后分成,合作类型,
#                                      AA下载用户数占比,	
#                                      BB下载用户数占比,	
#                                      CC下载用户数占比))
#month_sum=rpivotTable(data = selectresult, rows ="月份", vals ="税后分成", aggregatorName ="Sum", rendererName ="Table", width="100%", height="400px")
#day_sum=rpivotTable(data = selectresult, rows ="日期", vals ="税后分成", aggregatorName ="Sum", rendererName ="Table", width="100%", height="400px")
#write.xlsx(sheets,file = paste('C:/Users/lenovo/Desktop/0730.xlsx'))  #这个是用xlsx库的,但是效率比较慢

再来个Python的:

#以下是Python脚本
import time
import  numpy as np
import  pandas as pd
import openpyxl

start = time.clock()  #开始计时
# fileNameStr =r'C:\Users\lenovo\Desktop\数据源.xlsx' #需要处理的文件路径
# fileNameStr2 =r'C:\Users\lenovo\Desktop\单价列表.xlsx' #需要处理的文件路径
#
# xls=pd.ExcelFile(fileNameStr)  #第二个参数可以为,dtype='object'
# datasource=xls.parse('Sheet1')      #指定处理的工作簿
# data1=pd.DataFrame(datasource)               #导入数据到数据框
#
# xls2=pd.ExcelFile(fileNameStr2)  #第二个参数可以为,dtype='object'
# datasource2=xls2.parse('Sheet1')      #指定处理的工作簿
# data2=pd.DataFrame(datasource2)               #导入数据到数据框

data1 = pd.read_excel(r'C:\Users\lenovo\Desktop\数据源.xlsx', sheet_name='Sheet1')
data2 = pd.read_excel(r'C:\Users\lenovo\Desktop\CPA\单价列表.xlsx', sheet_name='Sheet1')

for i in range(0, len(data2)):
    data1.loc[data1.ID == data2.loc[:, 'ID'][i], '单价'] = data2.loc[:, '实际价格'][i]
    data1.loc[data1.ID!=0 ,'税前收入']=data1.单价*data1.激活数        #根据修改后是单价重算税前收入
    data1.loc[data1.ID!=0 ,'税后收入']=data1.单价*data1.激活数/1.06   #根据修改后是单价重算税后收入


 
#分别以月和日的维度统计汇总收入
month_sum=data1.pivot_table(values='税后收入',index='月份',aggfunc='sum') #数据透视表 columns='commercial'
day_sum  =data1.pivot_table(values='税后收入',index='日期',aggfunc='sum') #数据透视表 columns='commercial'

print("OK")
#输出到excel文件
nan_excel=pd.DataFrame()  #先建立一个空excel
nan_excel.to_excel(r'C:\Users\lenovo\Desktop\输出修正版.xlsx')  #打开那个空excel
writer = pd.ExcelWriter(r'C:\Users\lenovo\Desktop\输出修正版.xlsx')  #写入上面修改后的数据框
sheets=['datasource','month','day'] #定义工作簿名称列表
for sheet in sheets:
    data1.to_excel(writer, sheet_name='datasource')
    month_sum.to_excel(writer, sheet_name='month')
    day_sum.to_excel(writer, sheet_name='day')
writer.save()   #保存以上操作,这一步很重要!

elapsed = (time.clock() - start)    #结算计时
print("Time used:",elapsed)       #输出总用时

你可能感兴趣的:(Python,EXCEL,R)