处理Python中含NaN行拆分时的'float'对象无split属性错误
解决DataFrame拆分含NaN字符串列时的AttributeError问题
问题根源
你的代码存在两个关键问题:
- 循环遍历每行时,错误地固定取第一行的Place值(
df['Place'].iloc[0]),而非当前行的row['Place'] - 第三行的Place值为NaN(pandas中空值默认以float类型的NaN存储),而float对象没有
split()方法,因此触发报错
解决方案
方法1:循环内判断NaN并处理
直接在循环中对当前值做空值判断,针对性处理:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'Id': ['Id1', 'Id2', 'Id3'], 'Place': ['New York,London,Russia', 'Argentina', np.nan] }) L1 = [] for index, row in df.iterrows(): place_val = row['Place'] if pd.isna(place_val): L1.append([]) else: L1.append(place_val.split(","))
方法2:先替换NaN为空字符串再统一拆分
先将所有NaN替换为空字符串,空字符串调用split()会返回空列表,无需额外判断:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Id': ['Id1', 'Id2', 'Id3'], 'Place': ['New York,London,Russia', 'Argentina', np.nan] }) df['Place'] = df['Place'].fillna('') L1 = [] for index, row in df.iterrows(): L1.append(row['Place'].split(","))
方法3:pandas矢量化操作(高效推荐)
无需手动循环,利用pandas内置的str.split()方法自动处理,再将结果转为列表:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Id': ['Id1', 'Id2', 'Id3'], 'Place': ['New York,London,Russia', 'Argentina', np.nan] }) L1 = df['Place'].str.split(",").fillna([]).tolist()
以上三种方法最终得到的L1结果均为:[['New York', 'London', 'Russia'], ['Argentina'], []]
内容的提问来源于stack exchange,提问作者AB14
相关产品推荐
相关产品推荐

