![](/img/trans.png)
[英]Pandas series.rename gives TypeError: 'str' object is not callable error
[英]Pandas Series.rename not reflected in DataFrame columns
我试图重新命名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
使用以Pandas.Series
对象为参数的validate_column(ser)
,可以验证该列中的值,并使用一组预定义的列名来修改该特定列的列名。 为简单起见,在此示例中,该列被验证为email
列。
In [12]: def validate_column(ser):
...: # Value validation method returns that this column is email column
...: ser.rename('email', inplace=True)
...:
unknown_field
的当前名称为: unknown_field
,并且按预期的那样,在执行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_field
:
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]:
是否有更有效/直接的方法来重命名Series
并直接反映在DataFrame
?
重新编写函数以接受两个参数:
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
返回的任何结果都需要分配回去。
使用数据框的重命名功能并设置列参数。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.