Python Pandas如何快速处理列值:拆分字符串列生成浮点型新列
高效拆分字符串列并生成浮点型子列的方案
嘿,针对你这个需求,我有两个非常高效的pandas处理方案,都是基于向量化操作,比逐行循环或者零散处理快得多,尤其适合数据量较大的场景:
方案一:逐列拆分+批量拼接
这个方法逻辑直观,容易理解,同时保持了向量化的高效性:
import pandas as pd # 先构造你的示例DataFrame df1 = pd.DataFrame({ 'eye': ['34_35_a', '35_38_a', '64_43_a'], 'nose': ['45_66_b', '75_76_b', '85_66_b'], 'mouse': ['45_64_a', '95_37_a', '65_45_a'], 'ear': ['78_87_a', '38_79_a', '87_45_a'] }) # 初始化列表存储处理后的列数据 processed_cols = [] for col_name in df1.columns: # 按下划线拆分,取前两部分,直接转浮点型 split_result = df1[col_name].str.split('_', expand=True)[[0, 1]].astype(float) # 给拆分后的列重命名为原列名+_x/_y split_result.columns = [f"{col_name}_x", f"{col_name}_y"] processed_cols.append(split_result) # 把所有处理后的列横向拼接成最终DataFrame final_df = pd.concat(processed_cols, axis=1)
方案二:stack/unstack 一键式处理
这个方法更简洁,利用pandas的层级索引特性,避免显式循环,代码更紧凑:
import pandas as pd df1 = pd.DataFrame({ 'eye': ['34_35_a', '35_38_a', '64_43_a'], 'nose': ['45_66_b', '75_76_b', '85_66_b'], 'mouse': ['45_64_a', '95_37_a', '65_45_a'], 'ear': ['78_87_a', '38_79_a', '87_45_a'] }) final_df = ( df1.stack() # 把列转为行层级索引 .str.split('_', expand=True) # 拆分字符串 .iloc[:, :2] # 只保留前两部分 .astype(float) # 转浮点型 .rename(columns={0: 'x', 1: 'y'}) # 临时命名子列 .unstack() # 把层级索引转回列 ) # 把多级列名合并成你需要的格式(比如eye_x、eye_y) final_df.columns = [f"{col[0]}_{col[1]}" for col in final_df.columns]
这两个方案都能快速得到你想要的结果,而且所有新列的数据类型都是float。相比逐行处理的方法,它们充分利用了pandas的向量化运算优势,在数据量较大时性能提升非常明显。
内容的提问来源于stack exchange,提问作者tktktk0711
相关产品推荐
相关产品推荐

