Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas Series.rename未反映在数据框列中_Python_Pandas_Dataframe_Series - Fatal编程技术网

Python Pandas Series.rename未反映在数据框列中

Python Pandas Series.rename未反映在数据框列中,python,pandas,dataframe,series,Python,Pandas,Dataframe,Series,我试图通过验证特定列中的值来重命名列。以下是设置: 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@gmai

我试图通过验证特定列中的值来重命名
列。以下是设置:

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\u 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_字段的当前名称为:
unknown_字段
,如预期,在执行
validate_column
方法后,名称更改为
email

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
中的列名并没有像我预期的那样进行修改。在
df
变量中,它仍然命名为
unknown\u字段

In [16]: df
Out[16]: 
       unknown_field
0      bob@gmail.com
1  shirley@gmail.com
2     groza@pubg.com
目前,我使用以下代码手动修改
df
变量中的列名

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]: 
我的问题是:
是否有更有效/更直接的方法来重命名
系列
,并直接反映在
数据帧中?

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

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\u column
一次验证多个列


请注意,重命名不再在适当的位置进行,从
管道返回的任何结果都需要重新分配。

使用dataframe的重命名函数和set 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

创建一个以新旧列名作为键值对的字典,将此dict传递到rename。嗨,Thasin,谢谢你的建议。我知道这种方法,但我担心它不会在我的情况下完美地工作,因为我正试图将多个具有不同列名的文件合并到一个大文件中,这些文件具有“随机性”。因此,我决定验证每个列的值,并根据其值的模式重命名该列。谢谢BTWD你有重复的列名,应该用不同的名称替换吗?是的,我有一些列,如
phone1
phone2
(最多2个电话号码或电子邮件或可能的地址),我计划使用另一个函数来处理该列名谢谢@coldspeed,我不知道
.pipe()
功能。它使代码看起来更干净,并感谢添加参数的建议。我想知道是否有一种
pandas
内置方法可以以更直接的方式实现这一点。