Python 创建函数以重命名dataframe中的列

Python 创建函数以重命名dataframe中的列,python,pandas,function,dataframe,rename,Python,Pandas,Function,Dataframe,Rename,我的数据框架如下: df = pd.DataFrame({'$a':[1,2], '$b': [10,20]}) def rename_column_name(df, old_column, new_column): df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1) return df new_df = rename_column_name(df, '$a' , 'a')

我的数据框架如下:

df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
def rename_column_name(df, old_column, new_column):
    df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1)
    return df
new_df = rename_column_name(df, '$a' , 'a')
new_df = pd.DataFrame({'a':[1,2], '$b': [10,20]})
我尝试创建一个允许动态更改列名的函数,在该函数中我只需输入旧列名和新列名,如下所示:

df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
def rename_column_name(df, old_column, new_column):
    df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1)
    return df
new_df = rename_column_name(df, '$a' , 'a')
new_df = pd.DataFrame({'a':[1,2], '$b': [10,20]})
仅当我只有以下一个输入时,此功能才适用:

df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
def rename_column_name(df, old_column, new_column):
    df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1)
    return df
new_df = rename_column_name(df, '$a' , 'a')
new_df = pd.DataFrame({'a':[1,2], '$b': [10,20]})
这给了我这个新的_df,如下所示:

df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
def rename_column_name(df, old_column, new_column):
    df = df.rename({'{}'.format(old_column) : '{}'.format(new_column)}, axis=1)
    return df
new_df = rename_column_name(df, '$a' , 'a')
new_df = pd.DataFrame({'a':[1,2], '$b': [10,20]})
但是,我想创建一个函数,允许我根据自己的偏好对多个/一个列进行更改:

new_df = rename_column_name(df, ['$a','$b'] , ['a','b'])
并获得新的_df,如下所示

new_df = pd.DataFrame({'a':[1,2], 'b': [10,20]})
那么,如何使我的函数更具动态性,以允许我自由输入多个/一个列名并重命名它们

def rename_column_name(df, old_column, new_column):
    if not isinstance(old_column,(list,tuple)):
        old_column = [old_column]
    if not isinstance(new_column,(list,tuple)):
        old_column = [new_column]

    df = df.rename({'{}'.format(old) : '{}'.format(new) for old,new in zip(old_column,new_column)}, axis=1)
    return df # dang i should have used dict.zip like in the other solution :P
我想。。。虽然我不明白这比打电话容易多少

df.rename(columns={'$a':'a','$b':b})
我想。。。虽然我不明白这比打电话容易多少

df.rename(columns={'$a':'a','$b':b})

您不需要函数,可以使用dict comprehension来实现这一点:

In [265]: old_names = df.columns.tolist()                                                                                                                                                                   

In [266]: new_names = ['a','b']                                                                                                                                                                             

In [268]: df = df.rename(columns=dict(zip(old_names, new_names)))                                                                                                                                  

In [269]: df                                                                                                                                                                                                
Out[269]: 
   a   b
0  1  10
1  2  20
OP需要的功能:

In [274]: def rename_column_name(df, old_column_list, new_column_list): 
     ...:     df = df.rename(columns=dict(zip(old_column_list, new_column_list))) 
     ...:     return df 
     ...:                                                                                                                                                                                                   

In [275]: rename_column_name(df,old_names,new_names)                                                                                                                                                        
Out[275]: 
   a   b
0  1  10
1  2  20

您需要将列的
列表
传递给此函数。它可以是多列,也可以是单列。这应该可以满足您的需要。

您不需要函数,您可以使用
dict comprehension
来实现这一点:

In [265]: old_names = df.columns.tolist()                                                                                                                                                                   

In [266]: new_names = ['a','b']                                                                                                                                                                             

In [268]: df = df.rename(columns=dict(zip(old_names, new_names)))                                                                                                                                  

In [269]: df                                                                                                                                                                                                
Out[269]: 
   a   b
0  1  10
1  2  20
OP需要的功能:

In [274]: def rename_column_name(df, old_column_list, new_column_list): 
     ...:     df = df.rename(columns=dict(zip(old_column_list, new_column_list))) 
     ...:     return df 
     ...:                                                                                                                                                                                                   

In [275]: rename_column_name(df,old_names,new_names)                                                                                                                                                        
Out[275]: 
   a   b
0  1  10
1  2  20

您需要将列的
列表
传递给此函数。它可以是多列,也可以是单列。这应该可以满足您的需要。

您可以使用zip函数来实现,其中, 旧列名和新列名应列在列表中

def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed

    if(len(old_column_names) == len(new_column_names)):
        df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    return df  
要同时处理一列重命名和以列表的形式传递它们,函数将需要进一步的条件,这些条件可以是

 def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed
    if(isinstance(old_column_names, list)) and (isinstance(new_column_names, list)):
        if(len(old_column_names) == len(new_column_names)):
            df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    elif (isinstance(old_column_names, str)) and (isinstance(new_column_names, str)):
        df = df.rename(columns={'{}'.format(old_column_names) : '{}'.format(new_column_names)}, inplace=True)
    return df 

您可以使用zip函数来实现,其中, 旧列名和新列名应列在列表中

def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed

    if(len(old_column_names) == len(new_column_names)):
        df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    return df  
要同时处理一列重命名和以列表的形式传递它们,函数将需要进一步的条件,这些条件可以是

 def rename_column_name(df, old_column_names, new_column_names):

    //validating the such that all the new names have been passed
    if(isinstance(old_column_names, list)) and (isinstance(new_column_names, list)):
        if(len(old_column_names) == len(new_column_names)):
            df = df.rename(columns=dict(zip(old_column_names, new_column_names)), inplace=True)
    elif (isinstance(old_column_names, str)) and (isinstance(new_column_names, str)):
        df = df.rename(columns={'{}'.format(old_column_names) : '{}'.format(new_column_names)}, inplace=True)
    return df 

为什么不直接调用
df.rename(列={'a':'a','b':'b})
。。。为什么在这里有一个额外的函数?因为我需要一个函数,因为我有多个文件、列名要重命名。这没有意义为什么你需要一个函数来调用,而你必须有数据帧来调用函数。。。然后在那里做一些额外的事情,为什么不直接调用
df.rename(columns={'$a':'a','$b':'b'})
。。。为什么在这里有一个额外的函数?因为我需要一个函数,因为我有多个文件、列名要重命名。这没有意义为什么你需要一个函数来调用,而你必须有数据帧来调用函数。。。然后在那里做一些额外的事情,这不会处理他的另一种情况,只有一列被重命名…这不会处理他的另一种情况,只有一列被重命名。。。