使用列表推导式对DataFrame做标量运算时如何保留非数值列
列丢失的原因是select_dtypes(include=['number'])仅会返回筛选后的数值类型列,非数值的date列被直接排除在返回结果之外,因此最终结果中不存在这一列。
解决方案1:单行列表推导式实现
使用assign方法仅更新指定列,保留所有原始列:
dfs = [df.assign(**{col: df[col] * 100 for col in df.select_dtypes(include=['int']).columns}) for df in dfs]
该写法通过字典推导式批量提取所有int类型列做乘100运算,assign方法会保留原DataFrame的所有非数值列,仅更新指定的数值列。
解决方案2:封装为工具函数(可读性更高)
如果列表推导式太长可读性差,可以封装为独立函数处理,同时支持避免修改原始DataFrame:
def process_df(df, multiplier=100): # 提取所有int类型列名 int_cols = df.select_dtypes(include=['int']).columns # 复制原对象避免修改源数据,不需要保留原数据可删除这一行 df = df.copy() df[int_cols] *= multiplier return df dfs = [process_df(df) for df in dfs]
如果你的场景允许修改原始DataFrame,可以删除df.copy()这一行,执行性能会更好。
内容的提问来源于stack exchange,提问作者Anirban Nag 'tintinmj'
相关产品推荐
相关产品推荐

