拆分DataFrame列时触发TypeError的问题排查与解决
问题解答:拆分DataFrame列时遇到的TypeError问题
错误原因解释
咱们先搞懂这个报错:TypeError: object of type 'float' has no len(),其实是因为你的battery列里混了float类型的缺失值(也就是NaN)。str.split()是专门给字符串用的方法,当它碰到float类型的NaN时就会“卡壳”——Python没法获取一个float对象的长度(len()函数对float根本不生效),所以直接抛出了这个错误。
正确解决方案
针对你的数据场景(要么是X-cells Lion,要么是Lion,甚至可能有缺失值),我推荐两种靠谱的处理方式,按需选择:
方法一:正则表达式提取(精准高效)
正则能直接匹配你的数据模式,一步到位完成拆分,还能自动处理各种边界情况:
import pandas as pd # 1. 先填充battery列的缺失值为'Lion',再转为字符串类型(彻底规避float类型问题) data['battery'] = data['battery'].fillna('Lion').astype(str) # 2. 用正则提取cells和materials: # 正则含义:要么匹配"数字-cells"(可选组),后面跟着空格和"Lion";要么直接匹配"Lion" data[['cells', 'materials']] = data['battery'].str.extract(r'(\d+-cells)?\s*(Lion)', expand=True) # 3. 把没有cells的情况(比如原数据是'Lion')替换为'1' data['cells'] = data['cells'].fillna('1')
方法二:基于你的原代码修改(更贴合你的初始思路)
如果你更想用str.split的方式,只需先搞定float类型问题,再补全拆分后的值:
import pandas as pd # 1. 把battery列转为字符串,将NaN对应的字符串'nan'统一替换为'Lion' data['battery'] = data['battery'].astype(str).replace('nan', 'Lion') # 2. 拆分列,expand=True直接生成带列名的DataFrame split_df = data['battery'].str.split(' ', 1, expand=True) split_df.columns = ['cells', 'materials'] # 3. 处理只有"Lion"的情况:cells设为'1',materials补全为'Lion' split_df['cells'] = split_df.apply(lambda row: row['cells'] if '-cells' in row['cells'] else '1', axis=1) split_df['materials'] = split_df['materials'].fillna('Lion') # 4. 把拆分后的列合并回原DataFrame data = pd.concat([data, split_df], axis=1)
小提示
相比str.split,正则提取更适合你的固定数据模式,不仅代码更简洁,还能避免拆分后补值的繁琐步骤,出错概率更低。
内容的提问来源于stack exchange,提问作者Osca
相关产品推荐
相关产品推荐

