前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >盘点一个Python自动化办公实战案例(四)

盘点一个Python自动化办公实战案例(四)

作者头像
Python进阶者
发布2024-01-03 13:49:33
1490
发布2024-01-03 13:49:33
举报
文章被收录于专栏:Python爬虫与数据挖掘

砌下梨花一堆雪,明年谁此凭阑干。

大家好,我是皮皮。

一、前言

前几天在Python最强王者交流群【钟爱一生】问了一个Python自动化办公的问题,一起来看看吧。

【温馨提示】

遇到表达不清的,能稍微描述下,想要达成的结果吗?在excel上,或者画图也行。最好是把你想要的结果展示在excel中,另外,你展示的这个表格最好做个小的demo发上来,不要让大佬们再手动创建原始数据。实在不行,你就自己录制视频,或者发语音在群里提问都可以。

言归正传,一起来看看。上一篇文章中发生了一个小插曲,不过问题不大,结果总归是好的,玩归玩,闹归闹,别拿学习开玩笑。

二、实现过程

这里【小小明】大佬发问:对于昨天这个问题,我希望征求一下大家的意见,就是如果我们希望消除所有循环,对于下面的写法是否具有更简化的方案。

这里有个小插曲,昨天的时候【吴超建】偶然间问到明佬的这个代码中,是否可以消除for循环,然后这里就有了如上提问。

代码如下:

代码语言:javascript
复制
import pandas as pd

df = pd.read_excel("替换.xlsx")
ionp = df[df.编号.str.startswith("IONP")]
rule = "[一二三]工厂半成品"
chg = df[df.入库.str.fullmatch(rule) & df.出库.str.fullmatch(rule)]
t = chg.reset_index(names="idx").merge(ionp, left_on=["物料代码", "入库"], right_on=[
    "物料代码", "出库"], suffixes=("", "_y"))
df.loc[t.idx, "入库"] = t.入库_y.values
df

merge确实会导致索引丢失,所以只能通过重置索引来保留原有位置。

后来针对该问题,【隔壁😼山楂】也给出了自己的看法:我自认为更简化的方案就是直接查找,两两匹配对应替换,下方代码在我之前代码中修改了部分。

代码如下:

代码语言:javascript
复制
import pandas as pd

df = pd.read_excel('替换.xlsx')
# 1、找到【入库】和【出库】都包合一工厂、二工厂、三工厂半成品的记录
compile = r'[一二三]工厂半成品'
query_code = df.loc[df['入库'].str.fullmatch(compile) & df['出库'].str.fullmatch(compile), ['物料代码', '入库']]
# 2、根据上一查找结果的物料代码,找到当前需要替换的入库信息等于IONP出库信息的记录
ionp = df.loc[(df['物料代码'] + df['出库']).isin(query_code.agg(''.join, axis=1)) & df['编号'].str.startswith('IONP')].set_index('物料代码')['入库']
# 3、替换,将需要替换的记录变更为IONP的入库信息
df.loc[query_code.index, '入库'] = query_code['物料代码'].replace(ionp)
df

两位大佬隔空论道,读者们受益颇丰。这里也顺便回答了另外一个粉丝的小提问。

【小小明】:拼合确实可以,但是merge的代码是否有办法继续简化吗?

【隔壁😼山楂】:这个merge已经是一行了,目前我没有特别好的方法,能想到的就是换种思路,因为在这里就是需要跟踪到被替换的位置。由于merge会重置索引,而目前这些做法中就是确保索引在每一步变换过程中不会发生变化,所以使用merge时若担心索引重置就需要自行先重置下,保证在merge前后需要替换的索引没有变化。

【小小明】:那看来merge已经没有优化空间了,参考你的拼合法,又写了一下:

代码语言:javascript
复制
import pandas as pd

df = pd.read_excel("替换.xlsx")
ionp = df.loc[df.编号.str.startswith("IONP"), ['物料代码', '入库', '出库']]
ionp = ionp.set_index(ionp.物料代码 + ionp.出库).入库
rule = "[一二三]工厂半成品"
chg = df.loc[df.入库.str.fullmatch(
    rule) & df.出库.str.fullmatch(rule), ['物料代码', '入库']].agg(''.join, axis=1)
df.loc[chg.index, "入库"] = chg.replace(ionp)
df

守得云开见月明。

至此,粉丝【钟爱一生】提出的问题告一段落,真是一段艰辛的答疑。

三、总结

大家好,我是皮皮。这篇文章主要盘点了一个Python自动化办公的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

最后感谢粉丝【钟爱一生】提出的问题,感谢【瑜亮老师】、【隔壁😼山楂】、【小小明】、【黑科技·鼓包】、【猫药师Kelly】、【东哥】给出的思路,感谢【莫生气】、【冯诚】等人参与学习交流。

------------------- End -------------------

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

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

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、实现过程
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档