如何在Pandas中高效排除Datetime列,将其余数据列按各自最大值归一化
如何高效对DataFrame排除Datetime列进行归一化处理?
问题场景
我有一个包含1个Datetime列和多个数据列的DataFrame,所有数据列的值都是非负且起始于0,需要对这些数据列做归一化(每列除以该列最大值)。最初尝试直接执行:
df = df / df.max()
但因为Datetime列无法参与除法运算,报错:TypeError: cannot perform __truediv__ with this index type: DatetimeArray。
我不想逐个输入列名处理,已经找到一个可行方案:
df.loc[:, df.columns != 'timestamp'] = df.loc[:, df.columns != 'timestamp'] / df.loc[:, df.columns != 'timestamp'].max()
但觉得这个写法重复代码太多,希望有更高效的实现方式。
优化解决方案
方案1:按数据类型自动筛选(最灵活)
如果你的Datetime列是datetime64类型,可以用select_dtypes自动排除这类列,不用硬编码列名,扩展性更强(比如新增其他datetime列也能自动处理):
# 筛选出所有非datetime类型的数值列 numeric_columns = df.select_dtypes(exclude=["datetime64"]).columns # 对筛选出的列执行归一化 df[numeric_columns] = df[numeric_columns].div(df[numeric_columns].max())
方案2:用assign简化赋值(更简洁)
如果已经明确知道要排除的列名(比如timestamp),可以用assign方法一次性完成处理和赋值,避免重复写筛选条件:
# 先取出要处理的列,执行归一化后用assign更新回原DataFrame df = df.assign(**df.drop("timestamp", axis=1).div(df.drop("timestamp", axis=1).max()))
这里**用来将处理后的列字典解包,自动匹配原列名完成赋值。
方案3:利用df.max()的numeric_only参数(最简洁,推荐)
如果你的pandas版本在1.0及以上,直接在df.max()里指定numeric_only=True,计算最大值时会自动忽略非数值列,再做除法时Datetime列会保留原值,数值列自动完成归一化:
df = df.div(df.max(numeric_only=True))
一行代码就能搞定,完全避免了列筛选的重复逻辑,是最省心的方案。
这些方案都能让代码更简洁易维护,其中方案3是优先推荐的,只要你的环境支持对应pandas版本,就能一步解决问题。
内容的提问来源于stack exchange,提问作者Tom S
相关产品推荐
相关产品推荐

