如何拆分Pandas中多格式字符串列并转换为多行?
Pandas按多场景拆分字符串列为多行
问题分析
你的col X存在三种不同的格式:
- 多行换行分隔的条目(如
abc对应的col X) - 单行内用
数字)分隔的条目(如abc2对应的col X) - 单行内用
数字.分隔的条目(如abc3对应的col X)
原代码仅处理了换行拆分的场景,无法覆盖同一行内的多条目拆分,因此需要分两步处理所有格式。
解决方案
先构造示例DataFrame(模拟你的原始数据):
import pandas as pd data = { 'col A': ['abc', 'abc2', 'abc3', 'abc4'], 'col B': ['xyz', 'xyz2', 'xyz3', 'xyz4'], 'col X': [ '1. hello\n2. hi\n3. bye', '1) bonjur 2) yalla', '1. single 2. line 3. format', '1. some_val' ] } df = pd.DataFrame(data)
步骤1:拆分换行并展开
先处理多行换行的情况,将每个换行条目拆分为单独行,并清理空白:
# 拆分换行符,展开单行 df = df.assign(col_X_split=df['col X'].str.split('\n')).explode('col_X_split') # 清理字符串前后空白 df['col_X_split'] = df['col_X_split'].str.strip() # 过滤空行 df = df[df['col_X_split'] != ''].reset_index(drop=True)
步骤2:拆分单行内的多条目
用正则表达式匹配数字.或数字)前的空白作为拆分点,拆分同一行内的多个条目:
# 正则匹配:空白+数字+(.或) 的位置,作为拆分边界 df = df.assign(col_X_final=df['col_X_split'].str.split(r'\s+(?=\d+[.)])')).explode('col_X_final') # 再次清理空白 df['col_X_final'] = df['col_X_final'].str.strip()
步骤3:整理结果
保留目标列并重命名回原列名:
result = df[['col A', 'col B', 'col_X_final']].rename(columns={'col_X_final': 'col X'}) print(result)
最终输出
col A col B col X 0 abc xyz 1. hello 1 abc xyz 2. hi 2 abc xyz 3. bye 3 abc2 xyz2 1) bonjur 4 abc2 xyz2 2) yalla 5 abc3 xyz3 1. single 6 abc3 xyz3 2. line 7 abc3 xyz3 3. format 8 abc4 xyz4 1. some_val
内容的提问来源于stack exchange,提问作者Jlow
相关产品推荐
相关产品推荐

