如何在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)
代码说明
- 定义
get_second_min函数,逐行处理逻辑:- 根据当前行
Col0的值,从字典中取出对应的目标列名 - 过滤出目标列中存在于DataFrame、且数值大于该行
Col7的元素 - 对筛选结果排序,若元素数量≥2则取索引为1的第二小值,否则返回
pd.NA
- 根据当前行
- 使用
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,提问作者Евгения
相关产品推荐
相关产品推荐

