如何在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)
关键细节解释
正则模式说明:
(?P<key>[A-Z][a-z]+(?: ID)?):命名捕获组key,匹配首字母大写的键,支持带ID的复合键::匹配键后的冒号和空格(?P<value>.+?):非贪婪匹配值,避免把后续键包含进去(?=\s+[A-Z][a-z]+(?: ID)?:|$):正向预查,匹配下一个键的开头(空格+大写键+冒号)或字符串结尾
预处理步骤:
原字符串中Doorlopende incasso是荷兰语“持续扣款”,属于Valutadatum(记账日期)的说明,因此通过字符串替换将其合并到Valutadatum的值中,确保字段归属正确。批量处理优势:
使用apply结合pd.Series可以快速将多行非结构化文本转换为结构化列,适合实际业务中的批量数据处理。
内容的提问来源于stack exchange,提问作者Abco Janse
相关产品推荐
相关产品推荐

