Для цикла, исключающего некоторые строки DataFrame на основе указанного значения - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть папка с 10000+ файлами, которые содержат данные 10 переменных (X1, X2, ..., X10).

Файлы называются просто File1.json, File2.json и т. Д.

Мне нужно создать фрейм данных для каждой переменной, то есть 10 фреймов данных.

INPUT

  • VARIABLES = [X1, X2, ..., X10]
  • FILES = [File1.json, File2.json, ... File14347.json]

Требуемый вывод

  • Кадр данных X1, X2, ..., X10

Я делаю следующее

for i in range(0, len(VARIABLES)):
    %reset_selective -f "^DATA$"
    DATA=pd.DataFrame()
    Data_name=VARIABLES[i]
    print(Data_name)
    for ii in range(0, len(FILES)):

        file_name1='Directory/'
        file_name2= FILES[ii]
        file_name=file_name1+file_name2
        with open(file_name, 'r') as fer:
             data1 = json.load(fer)
        df = pd.DataFrame({'count': data1})

        Var_namei=df['count']['consistname']
        if Var_namei==Data_name:
            #create Dataframe

Код отлично работает для первой переменной, так как я не знаю, какие файлы содержат данные X1.

Однако, начиная со второй итерации, нет смысла повторно открывать каждый отдельный файл, чтобы найти данные X2.Точно так же я должен открывать только файлы X10, когда достигну последней итерации.

Я хочу избегать открытия / рассмотрения файлов, данные которых уже использовались в качестве входных данных для DataFrame,Например, File2 содержит значения X1, поэтому я не хочу снова открывать File2, когда я ищу значения X2, X3 и т. д.

Я пытался добавить

k.iloc[ii,i]= ii

где k - это кадр данных с размером нулей (File, VAriable) после условия if, чтобы поместить 1 в столбец i и строки ii, когда файл ii переменной i открыт.Таким образом, я могу пропустить такие файлы с двумя строками во время следующих итераций.Но я не могу получить доступ к значениям k во время цикла for.

Есть предложения?спасибо

1 Ответ

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

Добро пожаловать на SO.Ваш код может быть намного проще, если немного изменить рефакторинг.

file_name1='Directory/'
FileDATA={}
for file_name2 in FILES:
    file_name=file_name1+file_name2
    with open(file_name, 'r') as fer:
        data1 = json.load(fer)
    if data1['consistname'] in VARIABLES:
        # Save the data1 object to FileDATA
        # Assuming that every element in VARIABLES is unique
        Data_name=data1['consistname']
        FileDATA[Data_name] = data1

for Data_name in VARIABLES:
    data1 = FileDATA[Data_name]
    df = pd.DataFrame({'count': data1})
    # create Dataframe

Первый цикл проходит по всем файлам один раз и сохраняет данные, которые соответствуют переменной [X1, X2, ..., X10], в словаре FileDATA.Затем вы можете зациклить переменные для обработки данных.

После удаления ненужных строк,

FileDATA={}
for file_name2 in FILES:
    with open('Directory/' + file_name2, 'r') as fer:
        data1 = json.load(fer)
    if data1['consistname'] in VARIABLES:
        FileDATA[data1['consistname']] = data1

for Data_name in VARIABLES:
    df = pd.DataFrame({'count': FileDATA[Data_name]})
    # create Dataframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...