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

如何在Pandas DataFrame中拆分无分隔符字符串为多列?

拆分无明确分隔符的字符串为Pandas DataFrame多列

针对你描述的场景,最优方案是利用正则表达式精准匹配键值对,再将匹配结果转换为结构化的DataFrame。以下是具体实现步骤:

核心思路

给定字符串是键: 值的格式,键的特征是:

  • 首字母大写,后续为小写字母
  • 部分键包含后缀ID(如Machtiging ID)
  • 键后紧跟冒号和空格

我们可以用正则表达式捕获所有键值对,再将其转换为字典,最终构造DataFrame。同时需要处理特殊短语Doorlopende incasso的归属问题(它属于Valutadatum的值前缀)。

代码实现

单条字符串处理

import pandas as pd
import re

# 输入字符串
raw_text = "Naam: TEST B.V. Omschrijving: Factuur 20-01-2024, klantnummer 1234567890. IBAN: NL41INGB0000467598 Kenmerk: 000011292292967 Machtiging ID: M10024815057 Incassant ID: NL39KPN271247010001 Doorlopende incasso Valutadatum: 24-01-2024"

# 预处理:将特殊短语合并到对应键的值中
processed_text = raw_text.replace("Doorlopende incasso Valutadatum:", "Valutadatum: Doorlopende incasso")

# 正则模式:捕获键(含带ID的复合键)和对应值
pattern = r'(?P<key>[A-Z][a-z]+(?: ID)?): (?P<value>.+?)(?=\s+[A-Z][a-z]+(?: ID)?:|$)'

# 提取所有键值对并转换为DataFrame
kv_pairs = re.findall(pattern, processed_text)
structured_df = pd.DataFrame([dict(kv_pairs)])

print(structured_df)

批量处理DataFrame列

如果你的数据是Pandas DataFrame的一列(多行数据),可以用apply批量处理:

import pandas as pd
import re

# 构造示例DataFrame
df = pd.DataFrame({
    'raw_text': [
        "Naam: TEST B.V. Omschrijving: Factuur 20-01-2024, klantnummer 1234567890. IBAN: NL41INGB0000467598 Kenmerk: 000011292292967 Machtiging ID: M10024815057 Incassant ID: NL39KPN271247010001 Doorlopende incasso Valutadatum: 24-01-2024",
        "Naam: EXAMPLE B.V. Omschrijving: Factuur 25-01-2024, klantnummer 0987654321. IBAN: NL99ABNA0123456789 Kenmerk: 00009876543210 Machtiging ID: M10024815058 Incassant ID: NL39KPN271247010002 Doorlopende incasso Valutadatum: 25-01-2024"
    ]
})

# 预处理函数
def preprocess_text(text):
    return text.replace("Doorlopende incasso Valutadatum:", "Valutadatum: Doorlopende incasso")

# 提取键值对的函数
def extract_structured_data(text):
    pattern = r'(?P<key>[A-Z][a-z]+(?: ID)?): (?P<value>.+?)(?=\s+[A-Z][a-z]+(?: ID)?:|$)'
    kv_pairs = re.findall(pattern, text)
    return pd.Series(dict(kv_pairs))

# 批量处理
df['processed_text'] = df['raw_text'].apply(preprocess_text)
structured_data = df['processed_text'].apply(extract_structured_data)

# 合并得到最终结构化DataFrame
final_df = pd.concat([df, structured_data], axis=1).drop(['raw_text', 'processed_text'], axis=1)

print(final_df)

关键细节解释

  1. 正则模式说明:

    • (?P<key>[A-Z][a-z]+(?: ID)?):命名捕获组key,匹配首字母大写的键,支持带ID的复合键
    • : :匹配键后的冒号和空格
    • (?P<value>.+?):非贪婪匹配值,避免把后续键包含进去
    • (?=\s+[A-Z][a-z]+(?: ID)?:|$):正向预查,匹配下一个键的开头(空格+大写键+冒号)或字符串结尾
  2. 预处理步骤:
    原字符串中Doorlopende incasso是荷兰语“持续扣款”,属于Valutadatum(记账日期)的说明,因此通过字符串替换将其合并到Valutadatum的值中,确保字段归属正确。

  3. 批量处理优势:
    使用apply结合pd.Series可以快速将多行非结构化文本转换为结构化列,适合实际业务中的批量数据处理。

内容的提问来源于stack exchange,提问作者Abco Janse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:35:09