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

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üş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:48:12