pandas 变量名在循环语句中的有效的动态命名表示方式?
本帖最后由 nh_wzg 于 2021-3-12 15:36 编辑对样式例子的语句中,pandas模块,读入一个excel文件的19张表后,进行数据处理的学习过程。
表名取名有一定的规格,用循环结构来进行动态命名表示,读入正常。但在其他进一步的与表名相关的变量名,
需要动态命名时,不一定能够正常运行。
行28开始的循环是前面行24开始,多行语句,做注释处理后的变更写法,可以正常运行。
行57开始的循环是前面行47开始,多行语句,做注释处理后的变更写法,包含有两处对变量名进行动态变化的处理,可以正常运行。
行60到63的循环是后面行64-79 ,多行语句,想作循环处理的语句,需要对两处变量名进行动态处理,按这个表达式,不能正常运行。
##--20210113-0952
##01 高压电缆/架空线
##02 电缆管道/管材/支架/盖板/桥架
##03 线行土建
##04 铁塔/砼杆/金具
##05 高压开关设备/看门狗/户外电缆分支箱/开关柜.高压/直流屏
##06 二次保护设备/通信屏
##07 变压器
##08 开关柜.低压/低压开关
##09 无功补偿及消谐系统
##10 密集母线及铜排
##11 低压电缆/电线
##12 桥架
##13 安健环
##14 通用辅材
##15 表箱/楼层配电箱#
a4='e:/天水观邸项目高低压配电工程/天水观邸项目高低压-清单2021.0205.xlsx'
import pandas as pd
f4=pd.ExcelFile(a4)
fs4=f4.sheet_names
## 读入数据
# f400=f4.parse(sheet_name=fs4,header=None) #有数据
# ......
# f418=f4.parse(sheet_name=fs4,header=None) #
## P02 -B
for i in range(19):
exec("f4%s=f4.parse(sheet_name=fs4,header=None)"%i)
## 把各表的columns进行统一
## 0:序号
## 1:名称
## 2:规格
## 3:单位
## 4:数量
## 5:单价
## 6:合计
## 7:备注
## 8:品牌
## 9:时间戳 / 类别?
#原:0,1,2,3,...共有约20列
#新:0,1,2,4,5,6,15,a,b,c #a备注 #b:9时间戳 / 类别? #c:品牌
## 补齐列数
# f402=f402.assign(a=None,b=None,c=None)
# f402=f402[] #7+1+2
# ......
# f417=f417.assign(a=None,b=None,c=None)
# f417=f417[] #7+1+2
# f418=f418.assign(a=None,b=None,c=None)
# f418=f418[] #7+1+2 这个有点不同
## P03 -B
for i in range(18):
exec("f4%s=f4%d.assign(a=None,b=None,c=None)"%(i,i))
## 下面的无法循环运行
# for i in range(18):
# exec("f4%s=f4%d[]"%(i,i))
f42=f42[] #7+1+2
f43=f43[] #7+1+2
f44=f44[] #7+1+2
f45=f45[] #7+1+2
f46=f46[] #7+1+2
f47=f47[] #7+1+2
f48=f48[] #7+1+2
f49=f49[] #7+1+2
f410=f410[] #7+1+2
f411=f411[] #7+1+2
f412=f412[] #7+1+2
f413=f413[] #7+1+2
f414=f414[] #7+1+2
f415=f415[] #7+1+2
f416=f416[] #7+1+2
f417=f417[] #7+1+2
f418=f418.assign(a=None,b=None,c=None)
f418=f418[] #7+1+2 这个有点不同
本帖最后由 nh_wzg 于 2021-3-12 15:31 编辑
现在应该算是自己查资料解决了。
但还是有小部分没想明白的地方,先把通过的代码语句发上来。
##--20210312-1521
a4='e:/天水观邸项目高低压配电工程/天水观邸项目高低压-清单2021.0205.xlsx'
import pandas as pd
f4=pd.ExcelFile(a4)
fs4=f4.sheet_names
## 读入数据
# f400=f4.parse(sheet_name=fs4,header=None) #有数据
# ......
# f418=f4.parse(sheet_name=fs4,header=None) #
## P02 -B
for i in range(19):
exec("f4%s=f4.parse(sheet_name=fs4,header=None)"%i)
## 把各表的columns进行统一
## 0:序号
## 1:名称
## 2:规格
## 3:单位
## 4:数量
## 5:单价
## 6:合计
## 7:备注
## 8:品牌
## 9:时间戳 / 类别?
#原:0,1,2,3,...共有约16-19列
#新:0,1,2,4,5,6,15,a,b,c #a备注 #b:9时间戳 / 类别? #c:品牌
## 补齐列数
## P03 -B
for i in range(2,18):
exec("f4%s=f4%d.assign(a=None,b=None,c=None)"%(i,i))
## 下面的无法循环运行 // 增加globals语句,修改占位符%d为%s,语句中有n个占位符,在括号内就要有n个循环变量i列出。
for i in range(18):
globals
exec("f4%s=f4%s[]"%(i,i))
## f42=f42[] #7+1+2
## ......
## f417=f417[] #7+1+2
f418=f418.assign(a=None,b=None,c=None)
f418=f418[] #7+1+2 这个有点不同,特殊处理
本帖最后由 nh_wzg 于 2021-3-12 15:51 编辑
没有想明白的是:
1、原来没有在循环语句中使用globals导致无法正常调用的dataframe,在做了全局申明后,是否一直都是全局了?
2、发现在后面其他几个部分的loop + exec语句中,同样类似语句,没有加globals语句,同样已经可以正常运行了。
3、按网络文章提示,测试调试语句通过,但没有查到相应在官方文档中,准确的表达方法》》exec("f4%s=f4%s[]"%(i,i)),
尤其是在其他部分的loop + exec语句中,最多有3个占位符的情况,也正常通过了。
4、在查loop + exec语句过程中,stackoverflow的大量作者都反对随便使用exec(),如果是在我上面样例的条件下面,不用exec(),有没有更好的编写方式?
## 下面的无法循环运行 // 增加globals语句,修改占位符%d为%s,语句中有n个占位符,在括号内就要有n个循环变量i列出。
for i in range(18):
globals
exec("f4%s=f4%s[]"%(i,i))
页:
[1]