使用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
两种方案最终都会得到正确的结果:
| A | B | C | D | E | first | second | |
|---|---|---|---|---|---|---|---|
| 0 | 10 | 20 | 3 | 4 | 7 | 1 | 0 |
| 1 | 20 | 30 | 4 | 5 | 6 | 1 | 0 |
| 2 | 30 | 10 | 5 | 6 | 7 | 0 | 4 |
内容的提问来源于stack exchange,提问作者Diederick C. Niehorster
相关产品推荐
相关产品推荐

