PySpark中如何存储for循环结果到列表以修改DataFrame列名
实现方案
你之前用append方法失败的核心原因是没有正确收集转换函数的返回值,要么是没把转换结果传入append,要么是列表初始化位置错误。
基础for循环实现
首先提前导入正则依赖库,原有驼峰转下划线的函数逻辑不需要修改:
import re def camel_to_snake(name): name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()
在循环外部初始化空列表,循环中把每次转换后的返回值追加到列表中即可:
df_columns = ['colNameOne', 'colNameTwo', 'colNameThree'] snake_case_cols = [] for column in df_columns: converted_col = camel_to_snake(column) snake_case_cols.append(converted_col)
运行后snake_case_cols的输出就是目标结果:
['col_name_one', 'col_name_two', 'col_name_three']
更简洁的列表推导式写法
针对逐元素转换收集结果的场景,可以直接用列表推导式替代显式for+append写法,代码更精简:
snake_case_cols = [camel_to_snake(col) for col in df_columns]
批量修改DataFrame列名
拿到转换后的列名列表,直接赋值给DataFrame的columns属性即可完成批量修改,不需要额外循环:
# 一行代码完成全量列名的驼峰转下划线替换 df.columns = [camel_to_snake(col) for col in df.columns]
你之前
append操作失败基本都是踩了以下两类坑:
- 初始化空列表后,循环内只调用转换函数,没把函数返回值作为参数传入
append()- 把空列表的初始化语句写在了for循环内部,每次循环都会重置列表为空,最终无法留存所有转换结果
内容的提问来源于stack exchange,提问作者Ana Beatriz
相关产品推荐
相关产品推荐

