DataFrame列表列转对应值列报错:TypeError: 'float' object is not iterable
解决DataFrame从列表列转宽表的报错问题
你的需求是把包含列表的两列(Column A为类别列表,Column B为对应权重列表)转换为宽表,原代码报错TypeError: 'float' object is not iterable,原因及解决方案如下:
错误原因
你代码中的if isinstance(value, list):分支完全多余且逻辑错误。当用zip(row['Column A'], row['Column B'])遍历配对时,value已经是Column B列表中的单个浮点数值(比如0.5、1.0),并非列表。错误进入该分支后,代码尝试迭代float类型的value,导致抛出迭代不可迭代对象的错误。
修正后的原始代码
直接去掉多余的判断分支,按一一对应的关系赋值即可:
import pandas as pd # 初始化原始DataFrame data = { 'Column A': [['Dogs','Cats','Horses'], ['Dogs'], ['Cats','Horses']], 'Column B': [[0.5,0.25,0.25], [1.0], [0.75,0.25]] } df = pd.DataFrame(data) # 获取所有唯一类别 keys = set(key for row in df['Column A'] for key in row) # 初始化新列为0.0 for key in keys: df[key] = 0.0 # 遍历每一行赋值 for i, row in df.iterrows(): for key, value in zip(row['Column A'], row['Column B']): df.at[i, key] = value # 删除原列并调整列顺序 df.drop(columns=['Column A', 'Column B'], inplace=True) df = df[['Dogs', 'Cats', 'Horses']] print(df)
更高效的Pandas方法(推荐)
避免使用iterrows(大数据量下效率低),可以用以下两种方式:
方法1:用apply转Series
import pandas as pd data = { 'Column A': [['Dogs','Cats','Horses'], ['Dogs'], ['Cats','Horses']], 'Column B': [[0.5,0.25,0.25], [1.0], [0.75,0.25]] } df = pd.DataFrame(data) # 将每行的类别和权重转为Series def row_to_wide(row): return pd.Series(dict(zip(row['Column A'], row['Column B']))) # 生成结果并填充缺失值为0 result_df = df.apply(row_to_wide, axis=1).fillna(0) # 调整列顺序 result_df = result_df[['Dogs', 'Cats', 'Horses']] print(result_df)
方法2:用explode+pivot
import pandas as pd data = { 'Column A': [['Dogs','Cats','Horses'], ['Dogs'], ['Cats','Horses']], 'Column B': [[0.5,0.25,0.25], [1.0], [0.75,0.25]] } df = pd.DataFrame(data) # 拆分列表为多行 df_exploded = df.explode(['Column A', 'Column B']) # 透视转宽表并填充0 result_df = df_exploded.pivot(columns='Column A', values='Column B').fillna(0).reset_index(drop=True) # 调整列顺序 result_df = result_df[['Dogs', 'Cats', 'Horses']] print(result_df)
以上三种方法都能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者lunapie
相关产品推荐
相关产品推荐

