为何df.assign未使用参数值?需将release_date改为datetime64类型
解决pandas中动态指定列修改类型的问题
问题场景
我编写了如下Python函数,期望将指定列的类型修改为datetime64:
def change_date_column_type(df,change_column_name): df=df.assign(change_column_name=df[change_column_name].astype('datetime64')) # return the result return df
调用代码:
result = change_date_column_type(test_df,'release_date') print(result)
得到的输出却新增了一列change_column_name,而非修改原有的release_date列:
output: movie_title release_date genre MPAA_rating change_column_name 0 titanic Dec 21, 1937 Drama R 1937-12-21 1 frozen Feb 9, 1940 Musical PG 1940-02-09 2 rythm Nov 13, 1940 Family G 1940-11-13 3 godfather Nov 12, 1946 Drama R 1946-11-12 4 red Feb 15, 1950 Musical PG-13 1950-02-15
如何让函数修改指定的原列类型,而非创建新列?
原因分析
df.assign()接收的是关键字参数,直接写change_column_name=...时,Python会将change_column_name作为字面量列名处理,而不是读取变量change_column_name的实际值,因此生成了新列而非覆盖原列。
解决方案
方案1:字典解包实现动态列名
将目标列名和转换后的数据构造为字典,通过**解包传递给assign(),即可用变量值作为列名覆盖原列:
def change_date_column_type(df, change_column_name): df = df.assign(**{change_column_name: df[change_column_name].astype('datetime64')}) return df
方案2:直接修改列(推荐,更直观)
先复制原DataFrame避免修改原始数据,再直接对目标列进行类型转换:
def change_date_column_type(df, change_column_name): df_copy = df.copy() df_copy[change_column_name] = df_copy[change_column_name].astype('datetime64') return df_copy
方案3:使用pd.to_datetime处理日期(更可靠)
如果原始列是字符串格式,pd.to_datetime()比astype()兼容性更强,能自动识别多种日期格式,还可通过format参数指定格式:
import pandas as pd def change_date_column_type(df, change_column_name): df_copy = df.copy() df_copy[change_column_name] = pd.to_datetime(df_copy[change_column_name]) return df_copy
内容的提问来源于stack exchange,提问作者shiviz
相关产品推荐
相关产品推荐

