You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则表达式拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:54:36