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

如何在Pandas中为每个Item按字典指定列并满足条件添加第二小值列

问题需求

现有Pandas DataFrame和字典my_dict,字典中每个Item对应DataFrame的若干列。需要给DataFrame新增一列,列值计算规则如下:

  • 针对每行Col0列对应的Item,从字典匹配到的列中筛选出大于该行Col7值的数值
  • 取这些数值中的第二小值
  • 若符合条件的数值不足2个,填充NaN

示例数据

import pandas as pd
my_dict={'Item1':['Col1','Col3','Col6'],
'Item2':['Col2','Col4','Col6','Col8'],
'Item3':['Col1','Col3','Col6']
        }
df=pd.DataFrame({
            'Col0':['Item1','Item2','Item3'],
            'Col1':[20,25,28],
            'Col2':[89,15,35],
            'Col3':[36,30,96],
            'Col4':[40,108,13],
            'Col5':[55,2,9],
            'Col6':[35,38,27],
            'Col7':[30,20,39],
            })

预期结果

df=pd.DataFrame({
            'Col0':['Item1','Item2','Item3'],
            'Col1':[20,25,28],
            'Col2':[89,15,35],
            'Col3':[36,30,96],
            'Col4':[40,108,13],
            'Col5':[55,2,9],
            'Col6':[35,38,27],
            'Col7':[30,20,39],
            'second min':[36,108, pd.NA]
            })
解决方案

可以通过df.apply()逐行处理,结合字典匹配对应列,筛选后排序取第二小值:

import pandas as pd

my_dict={'Item1':['Col1','Col3','Col6'],
'Item2':['Col2','Col4','Col6','Col8'],
'Item3':['Col1','Col3','Col6']
        }
df=pd.DataFrame({
            'Col0':['Item1','Item2','Item3'],
            'Col1':[20,25,28],
            'Col2':[89,15,35],
            'Col3':[36,30,96],
            'Col4':[40,108,13],
            'Col5':[55,2,9],
            'Col6':[35,38,27],
            'Col7':[30,20,39],
            })

def get_second_min(row):
    # 获取当前Item对应的列列表
    target_cols = my_dict[row['Col0']]
    # 筛选存在于DataFrame中、且数值大于Col7的元素
    filtered_vals = [row[col] for col in target_cols if col in df.columns and row[col] > row['Col7']]
    # 排序后取第二小值,不足2个则返回空值
    if len(filtered_vals) >= 2:
        return sorted(filtered_vals)[1]
    return pd.NA

# 生成新列
df['second min'] = df.apply(get_second_min, axis=1)
print(df)

代码说明

  1. 定义get_second_min函数,逐行处理逻辑:
    • 根据当前行Col0的值,从字典中取出对应的目标列名
    • 过滤出目标列中存在于DataFrame、且数值大于该行Col7的元素
    • 对筛选结果排序,若元素数量≥2则取索引为1的第二小值,否则返回pd.NA
  2. 使用df.apply()将函数应用到每一行,生成新列

运行输出

Col0  Col1  Col2  Col3  Col4  Col5  Col6  Col7 second min
0  Item1    20    89    36    40    55    35    30         36
1  Item2    25    15    30   108     2    38    20        108
2  Item3    28    35    96    13     9    27    39       <NA>

内容的提问来源于stack exchange,提问作者Евгения

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:17:47