大家好,我是皮皮。
一、前言
前几天在Python最强王者交流群【钟爱一生】问了一个Python
自动化办公的问题,一起来看看吧。
【温馨提示】
遇到表达不清的,能稍微描述下,想要达成的结果吗?在excel上,或者画图也行。最好是把你想要的结果展示在excel中,另外,你展示的这个表格最好做个小的demo发上来,不要让大佬们再手动创建原始数据。实在不行,你就自己录制视频,或者发语音在群里提问都可以。
言归正传,一起来看看。上一篇文章中发生了一个小插曲,不过问题不大,结果总归是好的,玩归玩,闹归闹,别拿学习开玩笑。
二、实现过程
这里【小小明】大佬发问:对于昨天这个问题,我希望征求一下大家的意见,就是如果我们希望消除所有循环,对于下面的写法是否具有更简化的方案。
这里有个小插曲,昨天的时候【吴超建】偶然间问到明佬的这个代码中,是否可以消除for循环,然后这里就有了如上提问。
代码如下:
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确实会导致索引丢失,所以只能通过重置索引来保留原有位置。
后来针对该问题,【隔壁😼山楂】也给出了自己的看法:我自认为更简化的方案就是直接查找,两两匹配对应替换,下方代码在我之前代码中修改了部分。
代码如下:
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已经没有优化空间了,参考你的拼合法,又写了一下:
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】、【东哥】给出的思路,感谢【莫生气】、【冯诚】等人参与学习交流。
【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。