Python中str.split搭配expand=True仍报‘Columns must be same length as key’错误
解决坐标数据拆分时的「Columns must be same length as key」错误
我太懂这种卡壳的感觉了——明明正则在Regexr里测着没问题,跑代码就报列长度不匹配,简直挠头。咱们一步步拆解问题,搞定它:
先理清核心问题
你的坐标格式是"4.970599399999999, 'lng': -1.6918635",要拆分纬度(第一部分)和经度('lng':后面的数值),但报错说明正则提取后生成的列,和原数据行数量不匹配——大概率是部分数据没被正则匹配到,或者分组逻辑有问题。
排查&解决步骤
1. 先揪出「不听话」的异常数据
Regexr用的是测试样本,但你的数据集里可能藏着格式不一致的行(比如少了逗号、引号格式变了、数值为空)。先筛选出匹配失败的行:
import pandas as pd # 假设你的坐标列叫coords # 先把你用的正则写进来 your_pattern = r"你的正则表达式" # 找出匹配失败的行 bad_rows = df[~df['coords'].str.contains(your_pattern, na=False)] print(bad_rows)
如果输出有内容,就针对性调整正则(比如兼容单/双引号、多余空格、缺失值)。
2. 优化正则,确保100%覆盖你的数据格式
针对你给出的示例,推荐用这个正则(兼顾空格、单引号、正负数值):
^([\d.-]+),\s*'lng':\s*([\d.-]+)$
([\d.-]+):匹配纬度/经度的数值(包含数字、小数点、负号)\s*:匹配'lng':前后可能存在的空格^和$:确保匹配整行,避免部分匹配导致的异常
如果数据里有双引号的情况,把'lng'改成["']lng["']就能兼容单双引号。
3. 用str.extract()替代拆分,保证列长度一致
别用str.split()处理这种结构化提取,str.extract()会基于正则分组生成对应列,哪怕匹配失败也会填充NaN,不会出现长度不匹配:
# 提取纬度和经度,生成两列 df[['latitude', 'longitude']] = df['coords'].str.extract(r'^([\d.-]+),\s*\'lng\':\s*([\d.-]+)$', expand=True) # 检查有没有匹配失败的行(latitude为NaN的就是) print(df[df['latitude'].isna()])
4. 处理匹配失败的行
如果确实有无法匹配的异常数据,你可以:
- 手动清理这些行(如果数据量小)
- 给缺失的经纬度填充默认值(比如
df['latitude'] = df['latitude'].fillna(0)) - 进一步调整正则,覆盖更多格式场景
内容的提问来源于stack exchange,提问作者SuperSecretAndNotSafeFromWork
相关产品推荐
相关产品推荐

