简体   繁体   中英

How can I manipulate a DataFrame name within a function?

How can I manipulate a DataFrame name within a function so that I can have a new DataFrame with a new name that is derived from the input DataFrame name in return?

let say I have this:

def some_func(df):
   # some operations
   return(df_copy)

and whatever df I put inside this function it should return the new df as..._copy, eg some_func(my_frame) should return my_frame_copy.

Things that I considered are as follows:

  1. As in string operations; new_df_name = "{}_copy".format(df) -- I know this will not work since the df refers to an object but it just helps to explain what I am trying to do.
def date_timer(df):
    df_copy = df.copy()
    dates = df_copy.columns[df_copy.columns.str.contains('date')]
    for i in range(len(dates)):
        df_copy[dates[i]] = pd.to_datetime(df_copy[dates[i]].str.replace('T', ' '), errors='coerce')
    return(df_copy) 
  1. Actually this was the first thing that I tried, If only DataFrame had a "name" attribute which allowed us to manipulate the name but this also not there:
df.name

Maybe f-string or any kind of string operations could be able to make it happen. if not, it might not be possible to do in python.

I think this might be related to variable name assignment rules in python. And in a sense what I want is reverse engineer that but probably not possible. Please advice...

It looks like you're trying to access / dynamically set the global/local namespace of a variable from your program.

Unless your data object belongs to a more structured namespace object , I'd discourage you from dynamically setting names with such a method since a lot can go wrong, as per the docs :

Changes may not affect the values of local and free variables used by the interpreter.


The name attribute of your df is not an ideal solution since the state of that attribute will not be set on default. Nor is it particularly common. However, here is a solid SO answer which addresses this.


You might be better off storing your data objects in a dictionary, using dates or something meaningful as keys. Example:

my_data = {}

for my_date in dates:
    df_temp = df.copy(deep=True) # deep copy ensures no changes are translated to the parent object
    # Modify your df here (not sure what you are trying to do exactly
    df_temp[my_date] = "foo"
    
    # Now save that df
    my_data[my_date] = df_temp

Hope this answers your Q. Feel free to clarify in the comments.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM