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

使用Pandas Apply获取每行前两大值列索引及赋值报错解决

解决Pandas赋值前两大值列索引时的Shape不匹配错误

错误原因

你遇到的ValueError是因为df.apply(...)返回的是一个Series,每个元素是长度为2的numpy数组。直接用zip(*...)拆分后赋值,Pandas会误判数据形状——它会认为你要把长度为3的元组适配原DataFrame的5列结构,导致形状不匹配。

解决方案

方案1:将apply结果转为DataFrame后赋值

把apply返回的Series转换成二维DataFrame,再分别提取列赋值:

import pandas as pd
import numpy as np

df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10], "C": [3,4,5], "D": [4,5,6], "E": [7,6,7]})

# 获取每行前两大值的列索引,转为DataFrame
top_two_idx = df.apply(lambda x: np.argsort(x)[::-1][:2], axis=1, raw=True).apply(pd.Series)
# 赋值到新列
df['first'] = top_two_idx[0]
df['second'] = top_two_idx[1]

方案2:用numpy实现更高效的批量处理

如果数据量较大,直接用numpy的向量操作会比apply快很多:

import pandas as pd
import numpy as np

df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10], "C": [3,4,5], "D": [4,5,6], "E": [7,6,7]})

# 对每行数值降序排序,取前2个索引
sorted_indices = np.argsort(-df.values, axis=1)[:, :2]
# 将索引映射为列名
top_two_cols = df.columns[sorted_indices]
# 直接赋值到新列
df[['first', 'second']] = top_two_cols

两种方案最终都会得到正确的结果:

ABCDEfirstsecond
0102034710
1203045610
2301056704

内容的提问来源于stack exchange,提问作者Diederick C. Niehorster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:11:22