You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:47:39