118

How do I get the name of a DataFrame and print it as a string?

Example:

boston (var name assigned to a csv file)

import pandas as pd
boston = pd.read_csv('boston.csv')

print('The winner is team A based on the %s table.' % boston)
2
  • 1
    Do you mean variable name? Commented Jul 30, 2015 at 15:03
  • 3
    It's worth reading this and this, and the comments and links therein. Commented Jul 30, 2015 at 15:07

8 Answers 8

96

You can name the dataframe with the following, and then call the name wherever you like:

import pandas as pd
df = pd.DataFrame( data=np.ones([4,4]) )
df.name = 'Ones'

print df.name
>>>
Ones
Sign up to request clarification or add additional context in comments.

8 Comments

I need to have the name as a variable. import pandas as pd df = pd.DataFrame( data=np.ones([4,4]) ) df.name = 'df' print df.name >>> df
For posterity, as of v 0.18.1 this does not survive pickling (for v 0.18.1 use to_pickle/ read_pickle instead of save/load if trying to reproduce the GitHub comment).
A workaround I found is to place your DataFrame's name in the index's name attribute (e.g. df.index.name = 'Ones'). This is maintained during pickling. This only works if your DataFrame's index is not already named something useful...
This is a poor idea because if you as much as drop something, the returned object will no longer have a name attribute. It's tempting, but will create inexplicable errors down the line.
Really veru bad idea. If you call df.name = Ones is the same than df['name] = 'Ones'. it means the valiues for that column will be 'One'. SO it is not a correct answer. You can stor your dataframes within a dictionary and use the key to identify them
|
61

Sometimes df.name doesn't work.

you might get an error message:

'DataFrame' object has no attribute 'name'

try the below function:

def get_df_name(df):
    name =[x for x in globals() if globals()[x] is df][0]
    return name

3 Comments

It will throw ` 'DataFrame' object has no attribute 'name'` when it doesn't assign any name
Just to make sure people aren't confused: what the snippet here does is to find the dataframe in all currently defined global variables and return its variable name. This is NOT guaranteed to work (e.g. your DF is a local variable) and there are no error handling mechanisms in place. You should only use this if you're sure what you're doing!
chill dude. Its only a suggestion for a solution. However, I have this situation where this snippet of code is not working.
31

In many situations, a custom attribute attached to a pd.DataFrame object is not necessary. In addition, note that pandas-object attributes may not serialize. So pickling will lose this data.

Instead, consider creating a dictionary with appropriately named keys and access the dataframe via dfs['some_label'].

df = pd.DataFrame()

dfs = {'some_label': df}

Comments

24

DataFrames don't have names, but you have an (experimental) attribute dictionary you can use. For example:

df.attrs['name'] = "My name"   # Can be retrieved later

attributes are retained through some operations.

3 Comments

Using df.attrs['name'] after pickling works. Great answer.
Thank you for alerting everyone about this new feature. The attributes dictionaries in series.attrs and dataframe.attrs both work and can contain as many attributes as one wishes to bind in the attributes dictionary.
my pleasure. As noted, pandas says this is an “experimental” feature, so hopefully they won't change it too much or remove it.
16

From here what I understand DataFrames are:

DataFrame is a 2-dimensional labeled data structure with columns of potentially different types. You can think of it like a spreadsheet or SQL table, or a dict of Series objects.

And Series are:

Series is a one-dimensional labeled array capable of holding any data type (integers, strings, floating point numbers, Python objects, etc.).

Series have a name attribute which can be accessed like so:

 In [27]: s = pd.Series(np.random.randn(5), name='something')

 In [28]: s
 Out[28]: 
 0    0.541
 1   -1.175
 2    0.129
 3    0.043
 4   -0.429
 Name: something, dtype: float64

 In [29]: s.name
 Out[29]: 'something'

EDIT: Based on OP's comments, I think OP was looking for something like:

 >>> df = pd.DataFrame(...)
 >>> df.name = 'df' # making a custom attribute that DataFrame doesn't intrinsically have
 >>> print(df.name)
 'df'

6 Comments

i need the name to be a variable somewhat like name=<table name>
What do you mean variable? Like calling df prints the name "df" instead of printing the dataframe?
Yes. That's what I meant.
say the name of the file is apple.csv. I want it to get printed like The file came from apple. --- only that apple has to be dynamic depending on the name of the csv file.
@leo, any solution to this? did you get the dataframe name without the quotes?
|
2

I am working on a module for feature analysis and I had the same need as yours, as I would like to generate a report with the name of the dataframe being analyzed. To solve this, I used the same solution presented by @scohe001, implemented with the inspect library:

import inspect

def aux_retrieve_name(var):
    callers_local_vars = inspect.currentframe().f_back.f_back.f_locals.items()
    return [var_name for var_name, var_val in callers_local_vars if var_val is var]

Note the additional .f_back term since I intend to call it from another function:

def header_generator(df):
    print('--------- Feature Analyzer ----------')
    print('Dataframe name: "{}"'.format(aux_retrieve_name(df)))
    print('Memory usage: {:03.2f} MB'.format(df.memory_usage(deep=True).sum() / 1024 ** 2))
    return

Running this code with a given dataframe, I get the following output:

header_generator(trial_dataframe)

--------- Feature Analyzer ----------
Dataframe name: "trial_dataframe"
Memory usage: 63.08 MB

Comments

1

Here is a sample function: 'df.name = file` : Sixth line in the code below

def df_list():
    filename_list = current_stage_files(PATH)
    df_list = []
    for file in filename_list:
        df = pd.read_csv(PATH+file)
        df.name = file
        df_list.append(df)
    return df_list

Comments

1

To get the variable name for a DataFrame in Python, you can't do it directly using native Python or pandas attributes. However, you can use a workaround by examining the globals() or locals() dictionaries to match IDs. Here's a function that can find the name of a DataFrame:

def find_df_name(df):
   name = [name for name, obj in globals().items() if id(obj) == id(df)]
   return name[0] if name else None

usage:

df_name = find_df_name(burnishing_defects)
print(df_name)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.