Pandas DataFrame解包报错:Too many values to unpack 求助
解决Pandas中apply返回多值赋值的问题
问题原因
你当前的写法oil_df["Oils"].apply(get_data).transpose().values在数据行数超过2时出错,核心原因是:
apply(get_data)返回的是一个Series,每个元素是包含两个值的元组- 对这个Series执行
transpose()不会改变其结构,最终values是一个一维数组(包含N个元组,N为数据行数) - 当尝试把这个一维数组赋值给两个列时,行数>2会触发“Too many values to unpack”——因为数组有N个元素,而你只提供了2个变量接收
两行时看似正常,其实是巧合:一维数组有2个元组,刚好能被两个变量分别接收,但此时每列会被赋值为整个元组,并非你期望的拆分后的值。
正确解决方案
方案1:将apply结果转为DataFrame直接赋值
这是最直观的方法,利用pd.Series将每个元组拆分为单独的列:
# 将apply返回的元组Series转换为DataFrame result = oil_df["Oils"].apply(get_data).apply(pd.Series) # 直接赋值给目标列 oil_df[["Price", "Unit"]] = result
或者更简洁的一行写法:
oil_df[["Price", "Unit"]] = oil_df["Oils"].apply(get_data).apply(pd.Series)
方案2:使用from_records快速转换
利用pd.DataFrame.from_records直接处理元组序列,效率略高于方案1:
oil_df[["Price", "Unit"]] = pd.DataFrame.from_records(oil_df["Oils"].apply(get_data))
方案3:用字典映射替代自定义函数(性能最优)
如果你的映射规则固定,用字典替代条件判断的自定义函数,能大幅提升处理速度(尤其数据量大时):
# 定义油种与价格、单位的映射字典 oil_mapping = { "Oil 1": (20, 50), "Oil 2": (30, 75), "Oil 3": (40, 100) } # 用map获取元组,再转为DataFrame赋值 oil_df[["Price", "Unit"]] = oil_df["Oils"].map(oil_mapping).apply(pd.Series)
关于axis=1报错的说明
你尝试的axis=1, result_type='expand'是针对DataFrame.apply的参数,而你是对Series.apply调用,Series的apply没有axis参数(默认仅按元素处理),因此会触发参数错误。
内容的提问来源于stack exchange,提问作者Tarık Sülüş
相关产品推荐
相关产品推荐

