【总结】Python数据处理-操作Excel
Python操作Excel
- 1.读取文件
- 1.1 pandas直接读取
- 1.1.1 读取excel
- 1.1.2 读取csv
- 1.1.3 读取文件夹
- 1.2 模块式读取,主程序调用
- 1.3 tkiner选择读取
- 1.4 pd创建dataframe
- 2.写入文件
- 2.1 pandas写入工作簿多个工作表
- 2.2 xlwings写入
- 2.2.1 写入已有工作簿多个sheet
- 2.2.2 单个写入
- 2.2.3 思路:带格式--创建模板,复制模板写入
- 3.常用数据清洗与处理
- 3.1 df查看信息
- 3.2 列数据筛选(导入时)
- 3.3 列数据处理
- 3.3.1 df挑选要展示的列
- 3.3.2 修改df列名
- 3.3.3 df增加一列
- 3.3.4 split()分列/map(),list[:]分列(取某几位)
- 3.3.5 函数(def,lambda)--A\B列作为条件,填充C列
- 3.3.6 函数(lambda)--小数转换为百分比
- 3.3.7 数字转为十位文本格式
- 3.3.8 numpy/df-文本转为int类型
- 3.3.9 .loc()--A列值=B列值
- 3.3.10 如果A列为特定值,在B列填为特定值
- 3.4 行数据筛选
- 3.4.1 去重
- 3.4.2 ceil() —0.5向上进制
- 3.4.3 思路:四舍五入 2378进制
- 3.4.3 lambda-将<0值填为0
- 3.4.4 df s2筛选后,s3为s1剩余部分
- 3.5 空值处理
- 3.5.1 空值填为0
- 3.5.2 若为空值则填为入另一列对应的值
- 4.数据透视&分组
- 4.1.1 pd.pivot
- 4.1.2 group by
- 4.1.3 思路:添加小计
- 4.1.4 思路:数据透视变形
- 5.df之间
- 5.1 pd.merge 匹配
- 5.1.1 思路:A表匹,匹不到用B表
- 5.2 pd.concat()纵向合并两df
- 5.3 两表根据关联列,A表中剔除/保留含B表列
- 6 python链接Mysql
- 没什么用的小技巧
- 运行计时
- 程序内进度条
1.读取文件
1.1 pandas直接读取
1.1.1 读取excel
字典形式导入
src1 = {'file': r'd:\user\医药销售09月薪资考核数据1010.xlsx','sht': 'Sheet1','cols': 'AE,AF,I,J,K,Z','names': ['客户名称', 'yj账号', 'yj网点', '上期逾期期末未回款金额', '工资月份', '大区'],'colsorder': ['工资月份', '大区', '客户名称', 'yj账号', 'yj网点', '上期逾期期末未回款金额']}
src1['data'] = pd.read_excel(src1['file'], sheet_name=src1['sht'], header=None, skiprows=1, usecols=src1['cols'], names=src1['names'])
1.1.2 读取csv
类似于导入excel,需注意encoding = ‘’utf-8’ 或 encoding = ‘’gbk’
df = pd.read_csv(file, encoding='utf-8', usecols=cols, low_memory=False)
1.1.3 读取文件夹
os.chdir(r'd:\user\桌面\BP-js12.7')extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]#combine all files in the list
js = pd.concat([pd.read_csv(f, encoding='gbk', low_memory=False) for f in all_filenames ])
1.2 模块式读取,主程序调用
思路:现有2张表,读入过程用函数封装,以模块形式调用。
具体做法:
①建立2个py文件,分别定义函数get_jsdf, get_bcmddf;
②将这2个文件(模块)放入同一文件夹《hkhsm》下,分别命名为importm_***。
》 导入jsdf,命名为importm_js.py
import os
import pandas as pd
import numpy as npdef get_jsdf(jsdir):files = getfiles(jsdir, '.csv')print(files)file = files[0]df = getdf(file)for f in files[1:]:newdf = getdf(f)df = pd.concat([df, newdf])return dfdef getdf(file):print(file)df = pd.read_csv(file, encoding='gbk', low_memory=False)df = df[df['大区'].isin(['ws大区', 'ky部', 'Tx']) & ~df['地区名称'].isin(['kyab区', 'kycd区'])]#一些数据处理过程df['yj账号'] = pd.to_numeric(df['yj账号'], errors='coerce').fillna(df['js账号'])df['yj账号'] = df['yj账号'].astype(np.int64)df['未收(未付)-本位币'] = df['未收(未付)-本位币'].apply(lambda x: 0.0 if x < 0.0 else x)return dfdef getfiles(path, extension):list = os.listdir(path)result = []for i in range(0, len(list)):temp = os.path.join(path, list[i])if os.path.isfile(temp) and os.path.splitext(temp)[1] == extension:result.append(temp)return resultif __name__ == '__main__':jsdir = r'd:\user\桌面\hkhs原始数据1\BP-js'df = get_jsdf(jsdir)# df = pd.read_pickle('./js.pkl')print(df.shape)print(df)print(df.info())
》 导入bcmd,命名为importm_bcmd.py
import pandas as pd
import osdef get_bcmddf(path, shortname):file = os.path.join(path, shortname)md = pd.read_excel(file, usecols='A')return mdif __name__ == '__main__':bcmd = get_bcmddf(r'd:\user\桌面\货款回收原始数据1', '补充名单.xlsx')print(bcmd.info())print(bcmd)
》建立一个关联py,命名为import_.py,将3张表导入
from .importm_js import get_jsdf
from .importm_bcmd import get_bcmddf
》在主程序调用模块
import hkhsm.import_ as im
》在主程序确定路径
》在主程序导入
# 货款回收目录
mydir = r'd:\user\桌面\hkhs原始数据1'# 结算bp(csv文件夹)
jsdir = os.path.join(mydir, 'BP-js')
jsdf = im.get_jsdf(jsdir)# bcmd(excel文件)
bcmd = im.get_bcmddf(mydir, 'bcmd.xlsx')# 2.导出文件
## xlwings导出,可自动打开```python
book = xw.Book()
book.sheets(1).range('A1').options(index=False).value = df
1.3 tkiner选择读取
单个文件
import tkinter as tk
from tkinter import filedialogroot = tk.Tk()
root.withdraw()file_path = filedialog.askopenfilename()
获取多个文件
- filedialog.askopenfilenames(),返回一个包含多个文件路径的元组(tuple)。通过迭代来对每个文件操作,以实现批处理。
- 批量读一个文件内容,然后写入另外一个文件中
import tkinter as tk
from tkinter import filedialogroot = tk.Tk()
root.withdraw()file_path = filedialog.askopenfilenames()
for f in file_path:fo = f.split('.')[0]+'.csv'with open(fo,'w') as foo:with open(f,'r') as fn:fn.readline()for line in fn.readlines():li = line.strip().split()foo.write('%f,%f\n'%(float(li[1]),float(li[0])))print(li)
1.4 pd创建dataframe
df = pd.DataFrame(columns=['数量', '金额'], index=['配送费', '1-20日', '20日后日均', '仓库操作费', '小计'])df['数量'] = [ps_num, beforetwenty_num, aftertwenty_num, warehouse_operation_num, sum]df['金额'] = [ps_bill, beforetwenty_bill, aftertwenty_bill, warehouse_operation_bill, Sum_bill]
2.写入文件
2.1 pandas写入工作簿多个工作表
xlsx = pd.ExcelWriter(r"d:\user\桌面\yy.xlsx")
table6.to_excel(xlsx, sheet_name='当期数据明细', index=False)
table1.to_excel(xlsx, sheet_name='明细1', index=False)
table3.to_excel(xlsx, sheet_name='明细2', index=False)
table5.to_excel(xlsx, sheet_name='明细3', index=False)
xlsx.close()
2.2 xlwings写入
2.2.1 写入已有工作簿多个sheet
s3 = table
s3 = pd.DataFrame(s3)
wd = xw.Book(r'E:\模板.xlsm')
sht = wb.sheets('py明细')
sht = wb.sheets('第一')
sht.range('A1').value = s3
wb.save()
2.2.2 单个写入
book = xw.Book()
book.sheets(1).range('A1').options(index=False).value = table
2.2.3 思路:带格式–创建模板,复制模板写入
bill_dir = './在途账单'template = './Template.xlsx'dest = os.path.join(os.path.dirname(template), "综合物流.xlsx")shutil.copyfile(template, dest)sht = xw.Book(dest).sheets('Sheet1')#精确到写入某个单元格count = 0start_row = 2 # 从0开始start_column = 2 # 从0开始sht[start_row - 2, start_column + count*2].value = dqsht[start_row - 1, start_column + count*2].value = "数量"sht[start_row - 1, start_column + count*2 + 1].value = '金额'
3.常用数据清洗与处理
3.1 df查看信息
print(df)print(df.shape)print(df.info())print(df.head())
3.2 列数据筛选(导入时)
3.3 列数据处理
3.3.1 df挑选要展示的列
cols2 = ['地区', 'yj账号', 'lxr']
dfcjb2 = dfcjb[cols2]
3.3.2 修改df列名
df.rename(columns={'kh卡号': 'yj账号'}, inplace=True)
3.3.3 df增加一列
#工资一列填为9月
s1['工资'] = '9月'
#增加一列为空
s1['当期回款金额'] = None
3.3.4 split()分列/map(),list[:]分列(取某几位)
#将转至组织中'/'之前的内容填入新增的一列工号1
s1['工号1'] = s1['转至组织'].astype(str).apply(lambda x: x.split('/')[0])
s2 = s1[s1['日期'].map(lambda x: x[-2:]) <= '20']
# 取结算账号前3位
sxty['结算3'] = [x[:3] for x in (sxty['结算账号'])]
3.3.5 函数(def,lambda)–A\B列作为条件,填充C列
例子:如果【用户类型】=专席且【转办状态】已转线 和任务分发,则【归属】填为坐席;
否则,归属=原用户类型。
方法一
def function(a, b):if a == '专席' and b in ['已转线', '任务分发']:return '坐席'elif a == '专席' and b not in ['已转线', '任务分发']:return '专席'else:return '坐席's1['归属'] = s1.apply(lambda x: function(x.用户类型, x.转办状态), axis=1)
方法二
df['归属'] = df.apply(lambda x: '坐席' if (x['用户类型'] == '专席') and (x['转办状态'] in ['已转线', '任务分发']) else x['用户类型'], axis=1)
3.3.6 函数(lambda)–小数转换为百分比
data1['比率1'] = data1['比率1'].apply(lambda x: format(x, '.2%'))
3.3.7 数字转为十位文本格式
# data['yj账号'] = '0' * (10-len(data['yj账号'])) + data['yj账号']
for i in data1.index:if len(data1.at[i,'yj账号']) < 10:data1.at[i, 'yj账号'] = '0' * (10 - len(data1.at[i,'yj账号'])) + data1.at[i, 'yj账号']
3.3.8 numpy/df-文本转为int类型
df['yj账号'] = df['yj账号'].astype(np.int64)
df['yj账号'] = int(df['yj账号'])
3.3.9 .loc()–A列值=B列值
sxdl.loc[:, '结算账号'] = sxdl.loc[:, '客户卡号']
3.3.10 如果A列为特定值,在B列填为特定值
# 列结算账号 为'0000000003'的,列结算地区 填为安徽区
sxty.loc[sxty.结算账号 == '0000000003', '结算地区'] = '安徽区'
3.4 行数据筛选
方法一 筛选出df:A列某值和B列某值
data1 = data1[(data1['工资月份'] == '10月') & (data1['大区'] == 'ws')]
方法二 筛选出df:A列某些值和不要B列某些值
df = df[df['大区'].isin(['ws', 'ky部', 'TS']) & ~df['地区名称'].isin(['kyhx区', 'kygm区'])]
3.4.1 去重
customer = customer.drop_duplicates('月结账号', keep='first')
3.4.2 ceil() —0.5向上进制
# 0.2进位0.5,1.6进位2.0
import mathdef NumTrans(x):return (math.ceil(x/0.5))*0.5
print(NumTrans(5.792))
3.4.3 思路:四舍五入 2378进制
# a.10KG以下的以0.1KG为制度,第二位及以后的小数采用四舍五入进位(1KG以下按照1KG计算);
# b.10-100KG以0.5KG为进制,采用2378制(2退3进7退8进),第二位及以后小数采用四舍五入进位;
# c.100KG以上,以1KG为制度,四舍五入取整。最后保留一位小数。def XL(l):if l < 10:return round((l*10)+0.5)/10elif l < 100:return round(((l*10)+0.5)/10*2, 0)/2else:return round(((l*10)+0.5)/10, 0)
3.4.3 lambda-将<0值填为0
df['未收(未付)-本位币'] = df['未收(未付)-本位币'].apply(lambda x: 0.0 if x < 0.0 else x)
3.4.4 df s2筛选后,s3为s1剩余部分
#文件s1 筛选:应付金额大于0,增值费用为运费#分为s2(每月1-20日) s3(20日后)s1 = s0[(s0['应付金额'] >= 0) & (s0['增值费用'] == '运费')]s2 = s1[s1['日期'].map(lambda x: x[-2:]) <= '20']s3 = s1[(~s1.isin(s2))]s3 = s3[~s3['日期'].fillna('null').isin(['null'])]
3.5 空值处理
3.5.1 空值填为0
cc['sdcw'] = cc['sdcw'].fillna(0)
table2['未回款'] = table2['未回款'].apply(lambda x: 0.0 if numpy.isnan(x) else x)
3.5.2 若为空值则填为入另一列对应的值
df['yj账号'] = pd.to_numeric(df['yj账号'], errors='coerce').fillna(df['js账号'])
4.数据透视&分组
4.1.1 pd.pivot
s2 = pd.pivot_table(s1, index=['考核', '跟进区', '客户名称', 'js账号', 'js网点'], values=['应收应付-CNY', '已核销金额-CNY', '未收(未付)-CNY'], aggfunc=np.sum)
s2 = s2.reset_index()
4.1.2 group by
dq_groups = bp3.groupby(['地区'])
ys = dq_groups['应收(应付)-本位币'].sum()/10000
ye = dq_groups['未收(未付)-本位币'].sum()/10000
pt_dq = pd.DataFrame({'应收金额': ys, '应收余额': ye})
例子:
方法一:
方法二:
4.1.3 思路:添加小计
4.1.4 思路:数据透视变形
5.df之间
5.1 pd.merge 匹配
bp1 = pd.merge(bpdf, lxr1, on=['yj账号'], how='left', validate="m:1")
table2 = pd.merge(s4, s5, on=['yj账号', 'yj网点'], how='left', validate="m:1")
table6 = data1.merge(customer, how='left', left_on='yj账号', right_on='yj号', validate='many_to_one')
5.1.1 思路:A表匹,匹不到用B表
#表sxdl与表wddm1匹配,匹配不到的填为-1
sxdl = pd.merge(sxdl, wddm1, how='left', left_on='所属区域代码', right_on='区部代码', validate='many_to_one')
sxdl['区部名称'] = sxdl['区部名称'].fillna(-1)
print(sxdl.shape)#遍历,匹配不到的使用表wddm2匹
for i in sxdl.index:if sxdl.at[i, '区部名称'] == -1:wd3 = sxdl.at[i, '网点']dfwddm = wddm2[wddm2['网点'] == wd3]if dfwddm.shape[0] > 0:sxdl.at[i, '区部名称'] = dfwddm.iat[0, 1]sxdl.at[i, '大区名称'] = dfwddm.iat[0, 2]
5.2 pd.concat()纵向合并两df
jsdf = jsdf
ywdf = ywdf
bpdf = pd.concat([jsdf, ywdf])
5.3 两表根据关联列,A表中剔除/保留含B表列
jsdf = jsdf[~jsdf['月结账号'].isin(tcmd['子账号'].values)]
jsdf = jsdf[jsdf['月结账号'].isin(tcmd['子账号'].values)]
6 python链接Mysql
import pandas as pd
from sqlalchemy import create_engine
# lyhk_sql_sentence 用于存储语句,见下方
from lyhk_sql_sentence import * # 链接MySQL 用户名root 密码1111 网络3306 数据库p&mrecovery
def get_engine():engine = create_engine('mysql+pymysql://root:1111@localhost:3306/p&mrecovery')return engine# 将读取的dataframe写入mysql
def to_sql(excel_name, table_name):engine = get_engine()excel_name.to_sql(table_name, engine, index=False, if_exists='replace')# 将mysql中处理好数据写回df
def read_sql(sql_sen):engine = get_engine()table = pd.read_sql_query(sql_sen, engine)return tableif __name__ == '__main__':to_sql(jcb, 'jcb')to_sql(jsyw, 'jsyw')mx = read_sql(sql_mx())
lyhk_sql_sentence.py
def sql_mx():mx ='''SELECT`jszh`,`yjzh`FROM jsywGROUP BY `jszh`, `yjzh`'''return mx
没什么用的小技巧
运行计时
#导入库后插入
import time
time_start = time.time()#末尾插入
time_end = time.time()
print('Time cost = %fs' % (time_end - time_start))
程序内进度条
import timedef ProgressBar(num):""":param num: 传入进度条总量值:return:"""total = 20if num == 0:print('传入参数不可为0,仅接受int类型')elif type(num) != int:print('传入参数仅接受int类型')else:for item in range(num + 1):test_num = int((item / num) * 100) # 当前百分比step = int(test_num / (100 / total)) # 一个‘#’的在100% 内的占比now = r"[ %s%s ]%s" % ("#" * step, ' ' * (total - step), str(test_num))sys.stdout.write("\r%s%%" % now)sys.stdout.flush()time.sleep(0.1)----------------
ProgressBar(100)
【总结】Python数据处理-操作Excel相关推荐
- Python自动化操作Excel
二.基础准备 环境:python 3.7+ 需要安装第三方模块:xlwings 运行编辑器:jupyter notebook 三.动手动脑 3.0 我们为什么要学编程 首先和大家简单聊一下运营(这里运 ...
- python excel 打印文档_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...
原标题:教你如何用Python轻轻松松操作Excel.Word.CSV,一文就够了,赶紧码住!!! 作者:奈何缘浅wyj Python 操作 Excel 常用工具 数据处理是 Python 的一大应用 ...
- Python“文件操作”Excel篇(上)
大家好,我们今天来一起探索一下用Python怎么操作Excel文件.与word文件的操作库python-docx类似,Python也有专门的库为Excel文件的操作提供支持,这些库包括xlrd.xlw ...
- python xlwt操作excel
python xlwt操作excel posted on 2018-04-18 14:46 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs ...
- abaqus python实例_abaqus Python实例-操作excel文件
abaqus Python实例--操作excel文件目前处理数据离不开excel,所以pythoner必须学会用python操作excel表格.Python 与excel交互方法也比较多,我一开始就接 ...
- Python脚本操作Excel实现批量替换
Python脚本操作Excel实现批量替换 大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换. 使用的工具 Openpyxl,一个处理excel的python库,处理excel, ...
- 用Python自动化操作Excel制作报表,真的是太方便啦!!!
今天小编来介绍一下如何用Python来操作Excel文件,当中需要用到的模块叫做openpyxl,其中我们会涉及到一些基本常规的操作,例如有 插入与查询数据 分类统计数据 数据的可视化 字体颜色的更改 ...
- python modifysetup什么意思_##python 如何操作excel? 有米有能直接modify的,不要再推荐那些只能读或者只能写的了...
python安装之后运行显示modify setup 你好,我想问一下,这个问题要怎么解决,我遇到了一摸一样的问题,希望不吝赐教~ python里有个math.modf(x)函数,modf是什么意思啊 ...
- 用 Python 自动化操作 Excel 制作报表,真的是太方便啦!!!
作者 | 俊欣 来源 | 关于数据分析与可视化 今天小编来介绍一下如何用Python来操作Excel文件,当中需要用到的模块叫做openpyxl,其中我们会涉及到一些基本常规的操作,例如有 插入与查询 ...
最新文章
- C# 返回值为 listT
- 使用动态代理简单模拟一下spring的事务管理
- NFS 安装配置及常见问题
- 多头注意力机制的理解
- MSN8.0经常出现连接错误,如何解决?
- 产品经理能力产品经理工作积累(3)
- 太原理工大学自考计算机应用难,太原理工大学人工智能精彩试题+问题详解
- Java面试题,成员变量以及成员方法的调用,类和对象的关系,程序详细流程,类和对象栈堆的详细解答
- N1盒子刷入codesys当PLC使用
- mdt 计算机名_配置 MDT 部署共享规则
- 程序员常用的软件(附下载地址)
- Sql Server 2012 Enterprise Edition 企业版 迅雷 下载地址
- 微信支付商户平台app支付开通方法详解
- Vue脚手架安装流程详解
- 苹果4计算机错误怎么办,苹果刷机失败卡在恢复模式怎么办?
- MySqlDataAdapter.Update -- 报错
- spring配置文件中的p和c命名空间的使用
- window Azure 部署java 应用
- SAP MM模块一些表
- 代码review的心得
热门文章
- C++ - 智能指针
- 关于酒吧经营管理总结(下)
- Delphi 特殊字符串的替换
- 鼠标跟随 html,鼠标跟随效果.html
- GDT与LDT的区别
- 创意生成网络can_下一个网络创意时应该做的10件事
- 像素和厘米怎么换算_临帖要像?计算机“算法”精确你的每一个像素!惊呆书法圈...
- 前端实现找回密码流程图
- JavaScript流程控制
- 计算机应用基础试题答案截图,计算机应用基础试题(带答案).docx