Динамически назначайте кадры данных объекту внутри оператора for

#python #pandas

Вопрос:

У меня есть 4 кадра данных с данными :

финал_101

финал_102

финал_103

финал_104

Я хочу распечатать их в один текстовый файл, динамически вызывая их по последним цифрам. Я попытался использовать приведенный ниже код, но я не могу заставить его работать, так как динамический шаг просто дает строковое значение вместо фрейма данных:

 file_extension = ['101', '102', '103', '104']

with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as f:
  for names in file_extension :
        f.write("n"   f"{names}_data"   "n")
        new_file = 'final_' str(names)
        new_file.loc['Total'] = new_file['samp'].sum()
        f.write("n" str(new_file) "n")
 

Этот шаг new_file = 'final_' str(names) просто дает строковое значение new_file, но не данные. Есть ли способ динамического вызова объекта?

Примечание. Файлы final_101, final_102, final_103, final_104 находятся в памяти, а не в каком-либо расположении файла.

также сабик упомянул различные сценарии, в которых они могут быть использованы
Правильное решение для этого кода приведено ниже.

 dfs = {'101' : final_101, '102': final_102, '103': final_103, '104': final_104}

with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
  for i, (key, df) in enumerate(dfs.items()):
        out_f.write("n"   f"{key}_data"   "n")
        new_file = df.copy()
        new_file.loc['Total'] = new_file['samp'].sum()
        out_f.write("n" str(new_file) "n")
 

Комментарии:

1. «Я хочу распечатать их в один текстовый файл, динамически называя их по последним цифрам». не пытайтесь использовать переменные динамически подобным образом. Вместо этого используйте контейнер, такой как список или диктант

2. Я могу написать его отдельно, повторив строки записи 4 раза, но не могу понять, кто это делает с помощью функции.

3. @juanpa.arrivillaga Не могли бы вы, пожалуйста, объяснить немного больше? Извините, я немного новичок в этой логике, поэтому пытаюсь понять, что вы имеете в виду

Ответ №1:

(обновлено по комментариям…)

В python можно извлекать переменные по имени, но на самом деле это не рекомендуется.

Если их всего четыре, вы можете достаточно легко запрограммировать их:

 dfs = [final_101, final_102, final_103, final_104]

with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
  for i, df in enumerate(dfs):
    header = i == 0  # only write out the header for the first one
    df.to_csv(out_f, header=header)
 

Если у вас есть переменное число, лучший способ изменить код, генерирующий их, чтобы он помещал данные в диктант, чтобы они назывались final[101] или final['101'] (в зависимости от того, лучше ли 101 воспринимать как число или как текстовую метку). Тогда вы сможете повторить все сначала final.items() , вот так:

 with open(f"myfile_{timestamp}.txt", mode="w", encoding="utf-8") as out_f:
  for i, (key, df) in enumerate(final.items()):
    header = i == 0  # only write out the header for the first one
    # optionally write out key here
    df.to_csv(out_f, header=header)
 

Если вам абсолютно необходимо искать переменные по именам, вы можете проверить globals() ; хотя на самом деле это не рекомендуется в повседневном программировании.

Комментарии:

1. Он показывает «[Errno 2] Нет такого файла или каталога: ‘final_101′». . Но файл существует в среде в виде фрейма данных.

2. with open(f"{names}_data") as in_f: это не открывает фрейм данных

3. Ах, эти переменные находятся в памяти, а не в файлах?

4. Спасибо! это то, что мне было нужно. Я просто внес небольшие изменения в соответствии со своими потребностями и обновил код в разделе вопросов.

5. Кстати, если вы не закончите использовать i , вы можете опустить enumerate и просто использовать: for key, df in dfs.items():