鱼C论坛

 找回密码
 立即注册
查看: 2534|回复: 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 ,多行语句,想作循环处理的语句,需要对两处变量名进行动态处理,按这个表达式,不能正常运行。


  1. ##--20210113-0952
  2. ##01 高压电缆/架空线
  3. ##02 电缆管道/管材/支架/盖板/桥架
  4. ##03 线行土建
  5. ##04 铁塔/砼杆/金具
  6. ##05 高压开关设备/看门狗/户外电缆分支箱/开关柜.高压/直流屏
  7. ##06 二次保护设备/通信屏
  8. ##07 变压器
  9. ##08 开关柜.低压/低压开关
  10. ##09 无功补偿及消谐系统
  11. ##10 密集母线及铜排
  12. ##11 低压电缆/电线
  13. ##12 桥架
  14. ##13 安健环
  15. ##14 通用辅材
  16. ##15 表箱/楼层配电箱#

  17. a4='e:/天水观邸项目高低压配电工程/天水观邸项目高低压-清单2021.0205.xlsx'
  18. import pandas as pd
  19. f4=pd.ExcelFile(a4)
  20. fs4=f4.sheet_names

  21. ## 读入数据
  22. # f400=f4.parse(sheet_name=fs4[0],header=None) #有数据
  23. # ......
  24. # f418=f4.parse(sheet_name=fs4[18],header=None) #

  25. ## P02 -B
  26. for i in range(19):
  27.     exec("f4%s=f4.parse(sheet_name=fs4[i],header=None)"%i)

  28. ## 把各表的columns进行统一
  29. ## 0:序号
  30. ## 1:名称
  31. ## 2:规格
  32. ## 3:单位
  33. ## 4:数量
  34. ## 5:单价
  35. ## 6:合计
  36. ## 7:备注
  37. ## 8:品牌
  38. ## 9:时间戳 / 类别?

  39. #原:0,1,2,3,...共有约20列
  40. #新:0,1,2,4,5,6,15,a,b,c #a备注 #b:9时间戳 / 类别? #c:品牌
  41. ## 补齐列数
  42. # f402=f402.assign(a=None,b=None,c=None)
  43. # f402=f402[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  44. # ......
  45. # f417=f417.assign(a=None,b=None,c=None)
  46. # f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  47. # f418=f418.assign(a=None,b=None,c=None)
  48. # f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同

  49. ## P03 -B

  50. for i in range(18):
  51.     exec("f4%s=f4%d.assign(a=None,b=None,c=None)"%(i,i))

  52. ## 下面的无法循环运行
  53. # for i in range(18):
  54. #     exec("f4%s=f4%d[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
  55.    
  56. f42=f42[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  57. f43=f43[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  58. f44=f44[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  59. f45=f45[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  60. f46=f46[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  61. f47=f47[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  62. f48=f48[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  63. f49=f49[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  64. f410=f410[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  65. f411=f411[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  66. f412=f412[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  67. f413=f413[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  68. f414=f414[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  69. f415=f415[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  70. f416=f416[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  71. f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2

  72. f418=f418.assign(a=None,b=None,c=None)
  73. f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同

复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

现在应该算是自己查资料解决了。

但还是有小部分没想明白的地方,先把通过的代码语句发上来。

  1. ##--20210312-1521

  2. a4='e:/天水观邸项目高低压配电工程/天水观邸项目高低压-清单2021.0205.xlsx'
  3. import pandas as pd
  4. f4=pd.ExcelFile(a4)
  5. fs4=f4.sheet_names

  6. ## 读入数据
  7. # f400=f4.parse(sheet_name=fs4[0],header=None) #有数据
  8. # ......
  9. # f418=f4.parse(sheet_name=fs4[18],header=None) #

  10. ## P02 -B
  11. for i in range(19):
  12.     exec("f4%s=f4.parse(sheet_name=fs4[i],header=None)"%i)

  13. ## 把各表的columns进行统一
  14. ## 0:序号
  15. ## 1:名称
  16. ## 2:规格
  17. ## 3:单位
  18. ## 4:数量
  19. ## 5:单价
  20. ## 6:合计
  21. ## 7:备注
  22. ## 8:品牌
  23. ## 9:时间戳 / 类别?

  24. #原:0,1,2,3,...共有约16-19列
  25. #新:0,1,2,4,5,6,15,a,b,c #a备注 #b:9时间戳 / 类别? #c:品牌
  26. ## 补齐列数

  27. ## P03 -B

  28. for i in range(2,18):
  29.     exec("f4%s=f4%d.assign(a=None,b=None,c=None)"%(i,i))

  30. ## 下面的无法循环运行 // 增加globals语句,修改占位符%d为%s,语句中有n个占位符,在括号内就要有n个循环变量i列出。
  31. for i in range(18):
  32.     globals
  33.     exec("f4%s=f4%s[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
  34.    
  35. ## f42=f42[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2
  36. ## ......
  37. ## f417=f417[[0,1,2,4,5,6,15,'a','b','c']] #7+1+2

  38. f418=f418.assign(a=None,b=None,c=None)
  39. f418=f418[[0,1,2,3,4,5,14,'a','b','c']] #7+1+2 这个有点不同,特殊处理
复制代码
小甲鱼最新课程 -> https://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(),有没有更好的编写方式?


  1. ## 下面的无法循环运行 // 增加globals语句,修改占位符%d为%s,语句中有n个占位符,在括号内就要有n个循环变量i列出。
  2. for i in range(18):
  3.     globals
  4.     exec("f4%s=f4%s[[0,1,2,3,4,5,15,'a','b','c']]"%(i,i))
  5.    
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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