代码之家  ›  专栏  ›  技术社区  ›  Toto Lele

pandas series.rename未反映在dataframe列中

  •  1
  • Toto Lele  · 技术社区  · 8 年前

    我正在尝试重命名 column 通过验证特定列中的值。设置如下:

    In [9]: import pandas as pd
    
    In [10]: df = pd.DataFrame(
        ...:         {"unknown_field": ['bob@gmail.com', 'shirley@gmail.com', 'groza@pubg.com']}
        ...:     )
    
    In [11]: df
    Out[11]: 
           unknown_field
    0      bob@gmail.com
    1  shirley@gmail.com
    2     groza@pubg.com
    

    使用 validate_column(ser) ,这需要 Pandas.Series 对象作为参数,它验证该列中的值,并使用预定义的列名集修改该特定列的列名。为了简单起见,在本例中,列被验证为 email 列。

    In [12]: def validate_column(ser):
        ...:     # Value validation method returns that this column is email column
        ...:     ser.rename('email', inplace=True)
        ...:     
    

    的当前名称 unknown_field 是: 未知字段 ,并且正如预期的那样,名称更改为 电子邮件 执行后 validate_column 方法:

    In [13]: df.unknown_field
    Out[13]: 
    0        bob@gmail.com
    1    shirley@gmail.com
    2       groza@pubg.com
    Name: unknown_field, dtype: object
    
    In [14]: validate_column(df.unknown_field)
    
    In [15]: df.unknown_field
    Out[15]: 
    0        bob@gmail.com
    1    shirley@gmail.com
    2       groza@pubg.com
    Name: email, dtype: object
    

    但是,在 df 没有按我预期的那样修改。它仍然被命名为 未知字段 在 数据框 变量:

    In [16]: df
    Out[16]: 
           unknown_field
    0      bob@gmail.com
    1  shirley@gmail.com
    2     groza@pubg.com
    

    目前,我使用以下代码在 数据框 变量。

    In [17]: for col in df.select_dtypes(object):
        ...:     df.rename(columns={col: df[col].name}, inplace=True)
        ...:     
    
    In [18]: df
    Out[18]: 
                   email
    0      bob@gmail.com
    1  shirley@gmail.com
    2     groza@pubg.com
    
    In [19]: 
    

    我的问题是:

    是否有更有效/更直接的方法来重命名 Series 直接反映在 DataFrame 是吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   cs95 abhishek58g    8 年前

    重新编写函数以接受两个参数:

    def validate_column(df, col_name):
        # Value validation method returns that this column is email column
        return df.rename({col_name : 'email'}, axis=1)
    

    现在,通过调用函数 DataFrame.pipe 以下内容:

    df.pipe(validate_column, col_name='unknown_field')
    
                   email
    0      bob@gmail.com
    1  shirley@gmail.com
    2     groza@pubg.com
    

    非常干净。如果要链接验证,这很有用:

    (df.pipe(validate_column, col_name='unknown_field')
       .pipe(validate_column, col_name='some_other_field')
       .pipe(validate_column, col_name='third_field')
    )
    

    …或修改 validate_column 一次验证多个列。

    请注意,重命名不再进行,并且返回的结果 pipe 需要重新分配。

        2
  •  0
  •   chifu lin    8 年前

    使用dataframe的rename函数并设置columns参数。

    import pandas as pd
    df = pd.DataFrame({"unknown_field": ['bob@gmail.com', 'shirley@gmail.com', 'groza@pubg.com']})
    df = df.rename(columns={'unknown_field': 'email'})
    

    输出:

        email
    0   bob@gmail.com
    1   shirley@gmail.com
    2   groza@pubg.com