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
内置方法可以以更直接的方式实现这一点。