如何在Pandas DataFrame中创建包含每行第二大值的col4列
实现DataFrame每行第二大值的正确方法
你的代码错误在于df.nlargest(2, columns=cols)是对整个DataFrame按指定列筛选前2行最大值,并非逐行计算每行的第二大值。以下是三种可行的正确实现方式:
方法1:使用apply逐行处理(直观易懂)
import pandas as pd import numpy as np df = pd.DataFrame([[4, 1, 5], [5, 2, 9], [2, 9, 3], [8, 5, 4]], columns=["col_A", "col_B", "col_C"]) df['col4'] = df.apply(lambda row: row.nlargest(2).iloc[1], axis=1)
- 逻辑:
row.nlargest(2)获取该行前2个最大值(降序排列),iloc[1]取第二个元素即第二大值,axis=1指定按行处理。
方法2:使用numpy.partition(性能最优,适合大数据集)
df['col4'] = np.partition(df.values, -2, axis=1)[:, -2]
- 逻辑:
np.partition会将每行数据中倒数第2大及更大的值移至末尾区域,直接取[:, -2]即可得到每行的第二大值,此方法避免了逐行循环,性能远高于apply。
方法3:排序后取第二大值
df['col4'] = df.apply(lambda row: sorted(row, reverse=True)[1], axis=1)
- 逻辑:将每行元素降序排序后,取索引为1的元素(即第二大值),实现简单但性能略逊于numpy方法。
执行任意一种方法后,最终DataFrame结果如下:
col_A col_B col_C col4 0 4 1 5 4 1 5 2 9 5 2 2 9 3 3 3 8 5 4 5
内容的提问来源于stack exchange,提问作者seblful
相关产品推荐
相关产品推荐

