鱼C论坛

 找回密码
 立即注册
查看: 2135|回复: 2

pandas 变量名在循环语句中的有效的动态命名表示方式?

[复制链接]
发表于 2021-3-11 12:15:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 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[0],header=None) #有数据
# ......
# f418=f4.parse(sheet_name=fs4[18],header=None) #

## P02 -B
for i in range(19):
    exec("f4%s=f4.parse(sheet_name=fs4[i],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[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
# ......
# f417=f417.assign(a=None,b=None,c=None)
# f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
# f418=f418.assign(a=None,b=None,c=None)
# f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #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[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
    
f42=f42[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f43=f43[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f44=f44[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f45=f45[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f46=f46[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f47=f47[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f48=f48[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f49=f49[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f410=f410[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f411=f411[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f412=f412[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f413=f413[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f414=f414[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f415=f415[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f416=f416[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2

f418=f418.assign(a=None,b=None,c=None)
f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-3-12 15:28:03 | 显示全部楼层
本帖最后由 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[0],header=None) #有数据
# ......
# f418=f4.parse(sheet_name=fs4[18],header=None) #

## P02 -B
for i in range(19):
    exec("f4%s=f4.parse(sheet_name=fs4[i],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[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
    
## f42=f42[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
## ......
## f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2

f418=f418.assign(a=None,b=None,c=None)
f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同,特殊处理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-12 15:47:31 | 显示全部楼层
本帖最后由 nh_wzg 于 2021-3-12 15:51 编辑

没有想明白的是:
1、原来没有在循环语句中使用globals导致无法正常调用的dataframe,在做了全局申明后,是否一直都是全局了?
2、发现在后面其他几个部分的loop + exec语句中,同样类似语句,没有加globals语句,同样已经可以正常运行了。
3、按网络文章提示,测试调试语句通过,但没有查到相应在官方文档中,准确的表达方法》》exec("f4%s=f4%s[[0,1,2,3,4,5,15,'a','b','c']]"%(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[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 08:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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