@Aionclassic

Python cоздание переменной с значением генерируемой переменной?

Пытаюсь написать код который будет пересекать определенные колонки разных xlsx файлах и выводить одинаковые значения из колонок.
Алгоритм программы:
1.Читаем папку, получаем путь ко всем xlsx файлам
2. Генерируем переменные:
a) переменные df1 ... dfN (фреймы Pandas) создаются в количестве найденных xlsx файлов, в каждую отдельно заливается найденный xlsx файл.
б) переменные set_data_df1 .... N из переменой df1....N ДОЛЖНА создавать уникальный список внутри определенного столбца целью его последующего пересечения (set_data_df1 & set_data_df2 & .... N)
Проблема заключается не могу понять как создать правильно переменные Б?

list_file = []
data_directory = '111'
for root, dirs, files in os.walk(data_directory):
    for filename in files:
        list_file.append(os.path.join(root, filename))

ii=0
for i in list_file:
    ii += 1
    globals()[f'df{ii}'] = pd.read_excel(i) #РАБОТАЕТ
    globals()[f'set_data_df{ii}'] = f'set(df{ii}[name_column].tolist()) #НЕ РАБОАТАЕТ


Помогите подправить код "=f'set(df{ii}[name_column].tolist())". Спасибо.
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@Aionclassic Автор вопроса
Всем спасибо, проблема решена путем в конвертации значения переменой из str в class object.
P.S. tolist() там не нужен, set() после конвертации
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
Ну если ты только изучаешь python, зачем тебе pandas. Код не надо править его нужно выкидывать.

a) Ты хочешь прочитать каждый xlsx файл в отдельный фрейм, это нормально. Создаешь пустой список и складываешь в него фреймы.
dfs = []
for filename in fileanmes:
    df = pd.read_excel(filename)
    dfs.append(df)

где filenames твои пути для xlsx файлов.

б) Задача не ясна. На сколько я понял у этих файлов разные имена колонок и надо выбрать общий для всех набор.

from functools import reduce
import numpy as np

df1 = pd.DataFrame({
    'A':[1],
    'B':[2]
})

df2 = pd.DataFrame({
    'A':[1],
    'C':[2]
})

df3 = pd.DataFrame({
    'A':[1],
    'D':[2]
})

dfs_column_names = [df1.columns, df2.columns, df3.columns]
print(reduce(np.intersect1d, dfs_column_names))
Вот так ты можешь найти общие колонки у любого количества фреймов.
Естественно тебе не нужно хардкодить список с колонками прям в первом цикле заноси не только фрейм в список, но и в другой список заноси его колонки потом вне списка сохрани общий набор колонок как я привел в примере.

Ну и я так понимаю в дальнейшем ты собираешься выбрать по уникальным для всех фреймов колонкам и собрать все в единый фрейм. pd.concat(dfs). Где dfs это список фреймов, с едиными колонками. То есть предварительно, ты как я показал нашел common_columns. и затеам dfs=[df[common_columns] for df in dfs]. И затем конкатенируешь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы