Pandas按$符号拆分DataFrame行成多行报错求解决方案
解决DataFrame按$拆分description列并展开为多行的问题
嘿,我来帮你搞定这个问题~你遇到的AttributeError: 'float' object has no attribute 'split',根源是你的description列里存在缺失值(NaN)——在pandas里NaN属于float类型,自然没法调用字符串的split方法啦。下面给你两种可行的解决办法,更推荐第二种,既简洁又高效:
方案一:改进你的原有思路(处理缺失值)
先把description列统一转成字符串类型,把可能存在的NaN替换成空字符串,再调整你的循环逻辑:
import pandas as pd # 先构造你的原始DataFrame(模拟数据) old_df = pd.DataFrame({ 'category': ['puppy', 'crappy', 'squeeky', 'fluffy'], 'description': ['dog$pup', 'cat$pet', 'animal', 'dog$pet'] }) # 处理可能的缺失值,统一转为字符串 old_df['description'] = old_df['description'].astype(str).replace('nan', '') # 调整你的代码,避免空字符串拆分出空行 series_list = [] for _, row in old_df.iterrows(): desc_parts = row['description'].split('$') if row['description'] else [] series_list.append(pd.Series(row['category'], index=desc_parts)) new_df = pd.concat(series_list).reset_index() new_df.columns = ['description', 'category'] new_df = new_df[['category', 'description']]
不过这种方法用了iterrows,如果你的DataFrame数据量很大,运行速度会比较慢,更推荐下面的内置方法。
方案二:用pandas的str.split + explode(强烈推荐)
从pandas 0.25版本开始,explode方法可以直接把列表类型的列展开成多行,简直是为这个需求量身定做的:
import pandas as pd old_df = pd.DataFrame({ 'category': ['puppy', 'crappy', 'squeeky', 'fluffy'], 'description': ['dog$pup', 'cat$pet', 'animal', 'dog$pet'] }) # 1. 把description按$拆分成列表,同时处理可能的NaN old_df['description'] = old_df['description'].str.split('$') # 给NaN填充空列表,避免explode报错 old_df['description'] = old_df['description'].fillna('').apply(lambda x: x if isinstance(x, list) else [x]) # 2. 一键展开列表为多行 new_df = old_df.explode('description').reset_index(drop=True)
运行后你就能得到想要的结果:
category description 0 puppy dog 1 puppy pup 2 crappy cat 3 crappy pet 4 squeeky animal 5 fluffy dog 6 fluffy pet
再啰嗦下错误原因
如果你的原始数据里description列有缺失值(比如某行是空的),pandas会自动把该列的 dtype 变成float(因为NaN是float类型),这时候你调用row['description'].split('$')就会触发报错——float对象可没有split方法哦。上面的两种方案都提前处理了这种情况,确保我们操作的是字符串或列表类型。
内容的提问来源于stack exchange,提问作者Qubix
相关产品推荐
相关产品推荐

