我已经运行了一个创建多个变量的python脚本。现在,我要遍历匹配特定模式的几个数据帧(由脚本创建),并对它们执行简单的操作。最初,我想获取shape()
中每个数据帧的行数(带有list_dfs
),如下所示:
['FAILEDRuns_0112',
'FAILEDRuns_0121',
'FAILEDRuns_0126',
'FAILEDRuns_0129',
'FAILEDRuns_0131',
'FAILEDRuns_0134',
'FAILEDRuns_0135',
'FAILEDRuns_0137',
'FAILEDRuns_0142',
'FAILEDRuns_0153',
'FAILEDRuns_0165',
'FAILEDRuns_0171',
'FAILEDRuns_0175']
事实上,如果我这样做:
for i in list(filter(failed_runs_finder.findall, dir())):
print(locals()[i].shape[0])
我得到了打印在屏幕上的行数:
1
0
0
0
1
0
0
0
0
0
0
0
0
其中包含我需要的信息,尽管不是我想要的格式。最终,我需要知道的是1的数量和零的数量,因此我考虑了对列表的理解,以最终将总和(即1的数量)与列表的长度(即...的总数)进行比较元素。
但是,如果我这样做:
[locals()[i].shape[0] for i in list_dfs]
我收到以下错误:
KeyError: 'FAILEDRuns_0112'
我不太了解错误的来源。据我所知,这不是列表理解的语法。
在列表理解中使用locals()
有什么关系吗?
我的第二个选择是迭代构建df并获取总和,尽管我认为列表理解更简单,而且我不太了解错误的出处。
答案 0 :(得分:0)
如果您确实必须依靠locals()
,请尝试以下操作:
[v.shape[0] for k, v in locals().items() if k in list_dfs]
但是,如建议的那样,最好使用单个dict
来存储所有名称和DataFrame
对象。
如果要获取行数:
from collections import Counter
cnt = Counter(v.shape[0] for k, v in locals().items() if k in list_dfs)
cnt[1]
# 2
cnt[0]
# 11