如何使用正则表达式拆分DataFrame中的列?
嘿,这个问题我太熟了!要把这种嵌套键值对格式的列拆成DataFrame的多列,用正则配合pandas的字符串处理工具就能轻松搞定,我给你两种实用方案:
方案1:硬编码固定键(适合键固定的场景)
如果你的指标(continuity、x-velocity这些)是固定不变的,直接写一个匹配所有键值对的正则表达式,一次性提取所有数据:
import pandas as pd # 假设你的DataFrame是这样的(替换成你自己的df) df = pd.DataFrame({ "other_col": ["row1", "row2", "row3"], "target_col": [ "1 {{continuity 1.0000e+00} {x-velocity 0.0000e+00} {y-velocity 4.4010e-02} {z-velocity 9.5681e-04} {energy 1.1549e-07} }", "2 {{continuity 1.0000e+00} {x-velocity 7.8788e-04} {y-velocity 1.2617e+01} {z-velocity 9.0445e-04} {energy 4.5605e-06} }", "3 {{continuity 2.3250e-01} {x-velocity 1.6896e-03} {y-velocity 1.2536e-02} {z-velocity 9.8980e-03} {energy 3.4032e-06} }" ] }) # 定义正则模式:匹配开头的ID,以及每个指标的数值 pattern = r'(\d+)\s+\{\{.*?continuity\s+([\deE+\-.]+).*?x-velocity\s+([\deE+\-.]+).*?y-velocity\s+([\deE+\-.]+).*?z-velocity\s+([\deE+\-.]+).*?energy\s+([\deE+\-.]+).*?\}\}' # 提取数据并指定列名 extracted_data = df["target_col"].str.extract(pattern, expand=True) extracted_data.columns = ["id", "continuity", "x-velocity", "y-velocity", "z-velocity", "energy"] # 把提取的字符串转为数值类型 extracted_data = extracted_data.apply(pd.to_numeric) # 合并到原DataFrame,删掉原目标列 final_df = pd.concat([df.drop("target_col", axis=1), extracted_data], axis=1) print(final_df)
这个方案的好处是速度快,逻辑直接,适合你确定所有指标不会变的情况。
方案2:动态提取键值对(适合键顺序多变或有新增的场景)
如果你的指标可能有新增、顺序不固定,用这种动态提取的方法更鲁棒,不需要硬编码所有键:
import pandas as pd # 还是用刚才的示例DataFrame df = pd.DataFrame({ "other_col": ["row1", "row2", "row3"], "target_col": [ "1 {{continuity 1.0000e+00} {x-velocity 0.0000e+00} {y-velocity 4.4010e-02} {z-velocity 9.5681e-04} {energy 1.1549e-07} }", "2 {{continuity 1.0000e+00} {x-velocity 7.8788e-04} {y-velocity 1.2617e+01} {z-velocity 9.0445e-04} {energy 4.5605e-06} }", "3 {{continuity 2.3250e-01} {x-velocity 1.6896e-03} {y-velocity 1.2536e-02} {z-velocity 9.8980e-03} {energy 3.4032e-06} }" ] }) # 先提取开头的ID df["id"] = df["target_col"].str.extract(r'(\d+)', expand=True).astype(int) # 提取所有{key value}格式的键值对 key_value_pairs = df["target_col"].str.extractall(r'\{(\w+-\w+|\w+)\s+([\deE+\-.]+)\}') key_value_pairs.columns = ["metric", "value"] key_value_pairs["value"] = pd.to_numeric(key_value_pairs["value"]) # 把键值对透视成列,按原行索引对齐 pivoted_metrics = key_value_pairs.reset_index().pivot(index="level_0", columns="metric", values="value") # 合并回原DataFrame,删掉原目标列 final_df = pd.concat([df.drop("target_col", axis=1), pivoted_metrics], axis=1) print(final_df)
这个方法会自动识别所有出现的指标,不管顺序如何,都能正确拆分成列,扩展性更强。
注意事项
- 如果你的数据里有像
y-velocity ...这种截断的内容,正则会匹配失败,建议先确保数据是完整的,或者调整正则的匹配规则(比如把数值部分改成可选,但这样可能会引入NaN)。 - 两种方法都用到了
pd.to_numeric,把提取到的字符串转为数值类型,方便后续分析。
内容的提问来源于stack exchange,提问作者diegoiva
相关产品推荐
相关产品推荐

