如何从含多行内容单元格的DataFrame中提取数据并导出CSV
Pandas 多行文本单元格按字段提取导出方案
原始数据结构
现有DataFrame的Detail列存储了换行拼接的动物属性文本,结构如下:
Detail -------------- 0 Animal: Lion, Weight: 600 kg, Class: Mammal 1 Animal: Monkey, Weight: 10 kg, 2 Animal: Snake, Class: Reptile 3 Animal: Frog, Class: Amphibian, Weight: 1 kg 4 Animal: Hawk, Class: Bird
目标需求
- 逐行解析
Detail列的多行文本,分别匹配Animal、Weight、Class三个字段 - 匹配到对应字段则提取整行文本,匹配不到则填充
NaN - 每个字段单独生成对应结构的DataFrame,最终分别导出为独立CSV文件
期望输出结构
- Animal表
Animal -------------- 0 Animal: Lion, 1 Animal: Monkey, 2 Animal: Snake, 3 Animal: Frog, 4 Animal: Hawk,
- Weight表
Weight -------------- 0 Weight: 600 kg, 1 Weight: 10 kg, 2 Weight: NaN 3 Weight: 1 kg, 4 Weight: NaN
- Class表
Class -------------- 0 Class: Mammal, 1 Class: NaN 2 Class: Reptile 3 Class: Amphibian, 4 Class: NaN
原有代码问题
之前编写的代码存在3个核心逻辑错误:
- 遍历单行内容时,错用整个Series的
df['Detail'].str.contains(entry)做判断,返回的是整列布尔序列,无法作为单行的if判断条件 - 普通Python字符串没有pandas专属的
.str访问器,content.str.split('\n')会直接触发报错 - 拆分文本后没有逐行匹配目标字段,直接将拆分后的列表存入结果,无法得到单字段的精准提取值
正确实现代码
import pandas as pd import numpy as np # 定义需要提取的字段列表 cols = ['Animal', 'Weight', 'Class'] for col in cols: extract_result = [] # 逐行遍历Detail列内容 for detail_content in df['Detail']: # 按换行拆分单元格内文本,去除前后空格、过滤空行 line_list = [line.strip() for line in detail_content.split('\n') if line.strip()] # 逐行匹配当前字段 match_value = np.nan for line in line_list: if col in line: match_value = line break extract_result.append(match_value) # 生成单字段DataFrame并导出CSV col_df = pd.DataFrame({col: extract_result}) col_df.to_csv(f'{col}.csv', index=False)
逻辑说明
- 拆分单元格文本时做空格清理和空行过滤,避免原始文本缩进、空行干扰匹配结果
- 每个单元格拆分后逐行匹配目标字段,匹配到第一个对应字段就终止当前行遍历,执行效率更高
- 导出时直接指定列名为字段名,不需要额外调整表头参数
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

