如何基于指定公司法律形式列表拆分DataFrame列字符串?
基于指定法律形式列表拆分DataFrame列
解决思路
核心是利用正则表达式结合优先匹配长法律形式的策略,确保准确拆分公司名称、法律形式和附加信息,避免短形式误匹配长形式或嵌入其他单词的情况。
具体实现步骤
- 预处理法律形式列表:按字符串长度倒序排序,优先匹配多词或较长的法律形式(比如先匹配
gmbh & co kg而非gmbh)。 - 构建安全正则模式:转义法律形式中的特殊字符(如
&),用|连接所有形式,通过正则分组提取三部分内容。 - 提取并整理数据:用pandas的
str.extract拆分列,处理空值得到最终结果。
代码示例
import pandas as pd import re # 定义全球公司法律形式列表 legal_forms = ['gmbh', 'ltd', 'inc', 'srl', 'spa', 'co', 'sa', 'ag', 'kg', 'ab', 'spol', 'sasu', 'sas', 'pvt', 'sarl', 'gmbh & co kg', 'llc', 'ilc', 'corp', 'ltda', 'coltd', 'se', 'as', 'sp zoo', 'plc', 'pvtltd', 'og', 'gen'] # 按长度倒序排序,优先匹配长法律形式 sorted_legal_forms = sorted(legal_forms, key=lambda x: len(x), reverse=True) # 构建正则模式:转义特殊字符,确保法律形式是独立部分 pattern = r'^\s*(.*?)\s+(' + '|'.join(re.escape(f) for f in sorted_legal_forms) + r')\s*(.*)$' # 示例数据 data = {'Company': ['XYZ ltd electronics', 'ABC ABC inc iron', 'AB XY Z inc', 'CD EF GHI JK llc incident']} df = pd.DataFrame(data) # 提取三部分内容 df[['Company', 'Legal form', 'Addition']] = df['Company'].str.extract(pattern, expand=True) # 处理附加信息列的空值,转为空字符串 df['Addition'] = df['Addition'].fillna('') print(df)
代码说明
- 排序逻辑:长法律形式优先匹配,避免短形式截断长形式(比如
gmbh & co kg不会被拆成gmbh加后续内容)。 - 正则安全处理:
re.escape处理特殊字符(如&),防止正则语法错误。 - 非贪婪匹配:
.*?确保只匹配法律形式之前的公司名称,不会过度匹配。 - 空值处理:当法律形式在字符串末尾时,附加信息列自动填充为空字符串,符合示例要求。
输出结果
| Company | Legal form | Addition |
|---|---|---|
| XYZ | ltd | electronics |
| ABC ABC | inc | iron |
| AB XY Z | inc | |
| CD EF GHI JK | llc | incident |
内容的提问来源于stack exchange,提问作者hazen23
相关产品推荐
相关产品推荐

