Извлечение кадра данных из словаря по имени - PullRequest
0 голосов
/ 04 октября 2019

Я сделал цикл, в котором я перебираю (csv) файлы в папке, считываю их в словарь фреймов данных и называю их по имени файла csv (например, file1.csv становится file1_df). Я выполняю некоторую работу с данными и генерирую новые строки, а затем пытаюсь поместить часть моих фреймов данных в новый фрейм данных (file1_df2). Я хотел бы позже сослаться на эти кадры данных вне словаря.

    df_dict = {}
    for file in os.listdir(datadir):  # Loop over the files in that folder (only has CSV files)
        df_name = file[:-4] + '_df'  # Trim off .csv to name the dataframe
        df_dict[df_name] = pd.read_csv(os.path.join(datadir, file))

Можно ли ссылаться на эти кадры данных по имени? Поэтому позже я могу просто позвонить file1_df2 вместо df_dict["file1_df2"]?

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


Я знаю, что этовозможно в таких языках, как SAS и Stata, но я никогда не понимал, как это сделать в Python. В этих языках вы можете подключить переменную-заполнитель непосредственно к имени чего-либо.

/* In SAS */
%let param = test1
libname path "C:\User\&param."

proc sql;
create &param._df as 
select * from path.&param.
quit;
/* In Stata */
foreach i in file1 file2 {
    import delimited "`i'.csv", clear
    save "`i'.dta", replace
}

и т. Д. Если это не возможно, я хотел бы знать это наверняка. Спасибо!

1 Ответ

2 голосов
/ 05 октября 2019

Отсутствие ответов, вероятно, связано с тем, что никто не может сказать, ПОЧЕМУ вы хотите это сделать. Кажется, вопрос возникает из-за применения рабочего процесса SAS / Stata к python, который просто не имеет никакого смысла.

Однако я думаю это делает то, что вы просите

import pandas as pd
my_csvs = ["name1.csv", "name2.csv", "name3.csv"]
my_dfs = [pd.read_csv(csv) for csv in my_csvs]
df_dict = {name.replace(".csv", "_df"): df for name, df in zip(my_csvs, my_dfs)}

# access dataframes with (advisable to use this method!)
csv2 = df_dict["name2_df"]

Затем мы можем добавить эти ключи в наше пространство имен с помощью вызова exec():

# now add them to the namespace
for k in df_dict.keys():
    exec(f"{k} = df_dict['{k}']")
    # or use "{k} = df_dict['{k}']".format(k=k) for python < 3.5?

# Now does this work?
print(name2_df)

И это действительно работает. Однако любая IDE помечает последнюю строку, потому что не похоже, что вы объявили эту переменную.

Я настоятельно не рекомендую использовать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...