无法用split拆分数据:ValueError问题及经纬度海拔拆分需求
解决split拆分数据时的ValueError问题
错误原因
你遇到的ValueError: Columns must be same length as key,是因为geo["telemetry"].str.split(": ", expand=True)拆分后得到的列数,和你要赋值的["alt", "lat", "lon"]这3列数量不匹配——要么是部分行拆分后元素数量不足3个,要么是telemetry字段的格式根本不是用": "分隔的三个值。
针对性解决方案
情况1:telemetry是字典结构(最常见场景)
从JSON数据源来看,telemetry大概率是包含altitude、latitude、longitude的字典结构,不需要用split,直接提取字典中的值即可:
sas_url = 'https://telemetria2023.blob.core.windows.net/geolocalizacao/edbaa694-0988-4b38-b45f-10835fc2272f/29/2023/11/02/22/30/66jaxcmrz4gwy' geo = pd.read_json(sas_url) geo = pd.DataFrame.from_dict(geo) # 直接从字典字段提取对应值 geo["alt"] = geo["telemetry"].apply(lambda x: x.get("altitude")) geo["lat"] = geo["telemetry"].apply(lambda x: x.get("latitude")) geo["lon"] = geo["telemetry"].apply(lambda x: x.get("longitude"))
或者用更简洁的方式将字典展开为列:
# 将telemetry字典展开为单独列,再提取目标字段 geo = pd.concat([geo, geo["telemetry"].apply(pd.Series)[["altitude", "latitude", "longitude"]]], axis=1) # 重命名列名 geo.rename(columns={"altitude": "alt", "latitude": "lat", "longitude": "lon"}, inplace=True)
情况2:telemetry是字符串格式(确需split拆分)
如果telemetry确实是字符串,先排查拆分后的列数问题:
# 查看拆分结果的结构和缺失值情况 split_result = geo["telemetry"].str.split(": ", expand=True) print("拆分后列数:", split_result.shape[1]) print("各列缺失值数量:") print(split_result.isna().sum())
如果是部分行拆分后列数不足,可限制拆分次数并自动填充缺失值:
# 最多拆分为3列,不足的位置用NaN填充 geo[["alt", "lat", "lon"]] = geo["telemetry"].str.split(": ", n=2, expand=True)
如果是分隔符错误,替换成实际的分隔符(比如逗号、空格等)再执行拆分操作。
内容的提问来源于stack exchange,提问作者Miguel Alves
相关产品推荐
相关产品推荐

