DataFrame列提取指定单位文本结果全为NaN问题排查
问题分析与解决
原代码的核心问题
- 列名不匹配:你的DataFrame目标列是
full_name,但代码中使用了filtered_df['text'],这会导致无法定位到正确的文本列,直接返回全量NaN。 - 硬编码索引逻辑错误:
iloc[:,1]强制取逗号分割后的第二列(索引从0开始),但目标单位Km2/W所在的分段位置不固定(比如你的示例中它在第5个分段,索引为4),硬编码索引完全不具备通用性。 - 提取逻辑错位:先固定取某一列再执行提取操作,而该列本身不包含目标单位,自然无法提取到有效内容。
正确实现方案
方案1:遍历分段匹配目标单位
这种方式逻辑直观,适合初学者理解:
search_string = 'Km2/W' def extract_target_segment(text): # 分割文本并去除每个分段的首尾空格 segments = [seg.strip() for seg in text.split(',')] # 遍历找到包含目标单位的分段 for seg in segments: if search_string in seg: return seg return None # 应用函数到目标列 filtered_df['extracted_text'] = filtered_df['full_name'].apply(extract_target_segment)
方案2:正则表达式直接匹配(更高效)
利用正则精准匹配包含目标单位的完整逗号分段:
import re search_string = 'Km2/W' # 正则规则:匹配位于逗号前后或字符串首尾、包含目标单位的完整分段 pattern = rf'(?<=,|^)\s*[^,]*{re.escape(search_string)}[^,]*\s*(?=,|$)' # 提取并清理结果 filtered_df['extracted_text'] = filtered_df['full_name'].str.extract(pattern, expand=False).str.strip()
两种方案都能准确提取出2.25 Km2/W这类包含目标单位的完整分段,后续你可以通过filtered_df['extracted_text'].str.extract(r'(\d+\.?\d*)').astype(float)提取数值并转为数值类型。
内容的提问来源于stack exchange,提问作者Andreuccio
相关产品推荐
相关产品推荐

