Ошибка в понимании списка с помощью `locals ()` в python - PullRequest
0 голосов
/ 21 февраля 2019

Я запустил скрипт на 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

Содержит информацию, которая мне нужна, но не в том формате, который мне нужен.В конечном итоге мне нужно знать количество единиц и нолей, поэтому я подумал о том, чтобы получить представление о списке, чтобы в итоге сравнить общую сумму (т.е. число единиц) с длиной списка, то есть с общим числомelements.

Однако, если я это сделаю:

[locals()[i].shape[0] for i in list_dfs]

Я получу следующую ошибку:

KeyError: 'FAILEDRuns_0112'

Я не совсем понимаю, откуда исходит ошибка,Насколько я понимаю, это не с точки зрения синтаксиса понимания списка.

Имеет ли это какое-либо отношение к использованию locals() в понимании списка?

Мой второй вариант будетпостроить df итеративно и получить сумму, хотя я думаю, что это проще с пониманием списка, и я не совсем понимаю, откуда исходит ошибка.

1 Ответ

0 голосов
/ 21 февраля 2019

Попробуйте вместо этого, если вы действительно должны полагаться на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...