Чтобы получить имя переменной, мы можем использовать код из этого ответа , скопированный ниже:
import inspect
def retrieve_name(var):
"""
Gets the name of var. Does it from the out most frame inner-wards.
:param var: variable to get name from.
:return: string
"""
for fi in reversed(inspect.stack()):
names = [var_name for var_name, var_val in fi.frame.f_locals.items() if var_val is var]
if len(names) > 0:
return names[0]
Проблема в том, что она не будет работать, когдаперебирая, скажем, список, потому что вы просто получите имя локальной переменной.Это связано с тем, как имена переменных работают в python.Переменная указывает на объект, то есть место в памяти, но место в памяти не указывает назад.Это означает, что для данного объекта вы не можете определить его имя.То же самое верно для контейнеров, таких как списки.Если, например, у вас есть список l, который содержит два объекта a и b l=[a,b]
, список фактически не сохраняет имена переменных a и b.Вместо этого, когда вы создаете список, он записывает место в памяти, на которое указывают a и b, то есть объекты, а не имена.
d = 'a'
print(retrieve_name(d))
#'d'
l = [d, d]
print([retrieve_name(element) for element in list ])
#['element', 'element']
При этом, если у вас есть словарь имен и объектов, вы можете делать то, что вы просили:
name_dict = {'df': df, 'df2':df2}
dfs = [frame.assign(Variable=name) for name, frame in name_dict.items()]
combined_df = pd.concat(dfs)
Однако, если все ваши фреймы данных имеют разные данныеИсточники, то есть более простой способ сделать все это.Я часто сталкиваюсь с проблемой наличия данных в нескольких разных источниках, и их имена, например, имена файлов.Допустим, у меня есть несколько файлов .csv, из которых я читаю данные, и я хочу объединить их все в pd.DataFrame
, но хочу, чтобы каждая строка запоминала, из какого файла она пришла.
import pandas as pd
#Let's make our two fake csv files a and b:
with open('a.csv', mode='w') as a, open('b.csv', mode='w') as b:
a.write('col1,col2\n1,1')
b.write('col1,col2\n2,2')
csv_files = ['a.csv', 'b.csv']
dfs = [pd.read_csv(csv_file).assign(filename=csv_file) for csv_file in csv_files]
#assign let's you assign the value of a column and returns a DataFrame, so it's
#great for list comprehensions, in which the df['some_col']='some_var'
#syntax does not work
combined_ab = pd.concat(dfs)
combined_ab
# col1 col2 filename
#0 1 1 a.csv
#0 2 2 b.csv