如何交换含NaN的DataFrame列表列元素(经纬度转纬度经度)
解决方法
问题出在你的处理逻辑没有区分列表元素和非列表元素,直接替换NaN成0会把整个[nan, nan]列表变成单个数值0,自然没法用下标访问。以下是两种可行的解决方案:
方案1:仅对有效列表交换元素,保留原缺失结构
如果不需要替换列表内的NaN,只是交换经纬度顺序,直接在apply里先判断元素是否为列表:
import pandas as pd import numpy as np # 初始化你的DataFrame df = pd.DataFrame({'col':[[-74.61286283, 40.56889437], [np.nan, np.nan], [-105.18943020000002, 40.07872419], [-96.83537306, 32.82099448]]}) # 交换列表内元素位置,非列表元素保持原样 df['lat_lng'] = df['col'].apply(lambda x: [x[1], x[0]] if isinstance(x, list) else x)
方案2:替换列表内的NaN同时交换顺序
如果需要把列表里的NaN替换成指定值(比如0),同时保留列表结构,可这样处理:
df['lat_lng'] = df['col'].apply( lambda x: [y if not pd.isna(y) else 0 for y in reversed(x)] if isinstance(x, list) else x )
关键说明
- 你之前用
fillna(0)的错误在于:它会把整个[nan, nan]列表替换成单个数值0,破坏了原有的列表结构,导致后续无法用下标访问元素。 - 核心逻辑是先判断元素类型,只对列表执行交换/替换操作,非列表元素直接跳过,避免下标访问错误。
内容的提问来源于stack exchange,提问作者RCN
相关产品推荐
相关产品推荐

