鱼C论坛

 找回密码
 立即注册
查看: 1923|回复: 14

[已解决]如何用python自动补充excel表格中的文字

[复制链接]
发表于 2020-8-24 12:24:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 超哥超级爱学习 于 2020-8-25 21:04 编辑

求各位大神帮忙
      因为工作的原因,需要对excel表格中的地址进行修改,主要问题是地址需要标准格式  比如:XX省XX市XX县  但是提供的地址经常XX省或者XX市缺失,我想做一个小程序能自动帮我修改,求大神提供思路或者方法啊。
  我现在能想到的是我先做一个标准数据库,包含所有的XX省XX市,然后和表格对比,不一致,然后再自动添加进去。
ps:这是原来的excel表格的文字样式和修改过的excel表格中的文字样式
     我看了看还是没有思路,下面几位朋友提到了openpyxl,我还是不知道该如何用这个库。
ps:新增了一个地址库,一个原始表格的样板。求各位大神继续帮忙啊
最佳答案
2020-8-26 00:03:58
import pandas as pd

a = pd.read_excel('需改名数据.xlsx')
print(f'原始数据:{a}')

b = pd.read_excel('地名库.xlsx')
print(f'标准地名库:{b}')

for i in range(len(b)):
    temp1 = b.loc[i, '区']  #取出标准区县名字
    temp2 = b.loc[i, '市']  #取出标准市名字
    for j in range(len(a)):
        if a.loc[j, '地址'].find(temp1) >= 0:  #如果在地址栏中找到标准区县名
            a.loc[j, '完整地址'] = b.loc[i, '地址']  #完整地址拼接
            for temp in a.loc[j, '地址'].split(temp1)[1:]:  #防止地址中出现两次区县名,切割后成列表来循环拼接
                a.loc[j, '完整地址'] +=  temp
        elif a.loc[j, '地址'].find(temp2) >= 0:#如果在地址栏中未找到标准区县名,那查找标准市名,再做拼接
                a.loc[j, '完整地址'] = b.loc[i, '省']+b.loc[i, '市']+a.loc[j, '地址'].split(temp2)[1]

print(f'查找后数据:{a}')

a.to_excel('result.xlsx', index=False)  #输出

之前陷入了误区,不需要切割出区县、市,直接查找就行了,不过我用的方法比较笨,就是循环,没想到更好的办法,你给的数据115个能完成110个,数据多了估计速度会慢点,可以试试用多进程多线程之类的再做做

你的数据表,最好不要有空格空项,填完整,试试看
1.png
2.png

文件夹.rar

26.5 KB, 下载次数: 1

售价: 2 鱼币  [记录]

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 12:32:45 | 显示全部楼层
直接用openpyxl呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 12:53:48 | 显示全部楼层
思路没问题吧,要双循环,就是如果你文件大,这样循环时间就长了,可以用pandas,先循环省市列表中县一列,去isin()找,找到了再拼接,应该会好一点
我做过一个识别扫描图片内容,根据抬头,自动重命名文件的,类似
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 14:29:49 | 显示全部楼层

不知道该如何下手
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 14:30:35 | 显示全部楼层
疾风怪盗 发表于 2020-8-24 12:53
思路没问题吧,要双循环,就是如果你文件大,这样循环时间就长了,可以用pandas,先循环省市列表中县一列, ...

我试试看,不知道如何用pandas
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 15:49:03 | 显示全部楼层
openpyxl就可以了,循环嵌套就好。基表上弄3分数据,第一个是省单独一列,第二个是省+市列,第三个是省+市+区,可以减少循环次数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-24 19:18:40 | 显示全部楼层
yhhpf 发表于 2020-8-24 15:49
openpyxl就可以了,循环嵌套就好。基表上弄3分数据,第一个是省单独一列,第二个是省+市列,第三个是省+市+ ...

我用这个方法试试  看看能搞定不  谢谢喽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 22:28:13 | 显示全部楼层

回帖奖励 +5 鱼币

你发个源文件上来,否则不好测试啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-24 23:19:19 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-8-25 15:23 编辑
import pandas as pd

a=pd.read_excel('2.xlsx')
print(a)
a['地址']=[i.split('省')[-1] for i in a['地址']]  #把省前面的全部去除
for i in range(len(a)):
    if a.loc[i,'地址'].find('市') != -1:
        a.loc[i,'市']=a.loc[i,'地址'].split('市')[0]  #取出市一级
    if a.loc[i,'地址'].find('县') != -1:
        a.loc[i,'县']=a.loc[i,'地址'].split('县')[0].split('市')[-1] #取出县一级
a=a.fillna('无')
print(a)

b=pd.read_excel('3.xlsx')
b['市']=[i.split('省')[1][:-1] for i in b['地址']]#取出市一级
b['省']=[i.split('省')[0] for i in b['地址']]#取出县一级
b=b.fillna('无')
print(b)

for i in range(len(b)):
    temp = b.loc[i, '市']
    for j in range(len(a)):
        if a.loc[j,'市'].find(temp) >=0:
            a.loc[j,'地址']=b.loc[j,'省']+ a.loc[j,'地址']  #包含的做拼接
print(a)

a['地址'].to_excel('4.xlsx',index=False)  #输出地址一列
写得比较啰嗦,不过大致就是这样,有更好的办法可以改改
微信截图_20200824231811.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-25 21:06:18 | 显示全部楼层
疾风怪盗 发表于 2020-8-24 22:28
你发个源文件上来,否则不好测试啊

我把源文件添加到附件里面了  pandas还没用过   还是一脸迷茫
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-25 21:09:53 | 显示全部楼层
疾风怪盗 发表于 2020-8-24 23:19
写得比较啰嗦,不过大致就是这样,有更好的办法可以改改

我感觉这个和我的需求比较像,我新增加了源文件,你可以试下看能用不  我的基础还太差  还不知道该如何测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 00:03:58 | 显示全部楼层    本楼为最佳答案   
import pandas as pd

a = pd.read_excel('需改名数据.xlsx')
print(f'原始数据:{a}')

b = pd.read_excel('地名库.xlsx')
print(f'标准地名库:{b}')

for i in range(len(b)):
    temp1 = b.loc[i, '区']  #取出标准区县名字
    temp2 = b.loc[i, '市']  #取出标准市名字
    for j in range(len(a)):
        if a.loc[j, '地址'].find(temp1) >= 0:  #如果在地址栏中找到标准区县名
            a.loc[j, '完整地址'] = b.loc[i, '地址']  #完整地址拼接
            for temp in a.loc[j, '地址'].split(temp1)[1:]:  #防止地址中出现两次区县名,切割后成列表来循环拼接
                a.loc[j, '完整地址'] +=  temp
        elif a.loc[j, '地址'].find(temp2) >= 0:#如果在地址栏中未找到标准区县名,那查找标准市名,再做拼接
                a.loc[j, '完整地址'] = b.loc[i, '省']+b.loc[i, '市']+a.loc[j, '地址'].split(temp2)[1]

print(f'查找后数据:{a}')

a.to_excel('result.xlsx', index=False)  #输出

之前陷入了误区,不需要切割出区县、市,直接查找就行了,不过我用的方法比较笨,就是循环,没想到更好的办法,你给的数据115个能完成110个,数据多了估计速度会慢点,可以试试用多进程多线程之类的再做做

你的数据表,最好不要有空格空项,填完整,试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-26 08:31:02 | 显示全部楼层
疾风怪盗 发表于 2020-8-26 00:03
之前陷入了误区,不需要切割出区县、市,直接查找就行了,不过我用的方法比较笨,就是循环,没想到更好 ...

太感谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-26 22:19:56 | 显示全部楼层
疾风怪盗 发表于 2020-8-26 00:03
之前陷入了误区,不需要切割出区县、市,直接查找就行了,不过我用的方法比较笨,就是循环,没想到更好 ...

我的基础太差了,我看了一晚上,还是看的迷迷糊糊的,方便时可以语音聊下吗?麻烦您了。QQ:326717860
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-26 22:52:55 | 显示全部楼层
超哥超级爱学习 发表于 2020-8-26 22:19
我的基础太差了,我看了一晚上,还是看的迷迷糊糊的,方便时可以语音聊下吗?麻烦您了。QQ:326717860

QQ加你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 03:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表