最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何根据字典映射动态计算每行指定列最小值
时间:2026-06-25 08:14:47 编辑:袖梨 来源:一聚教程网
本文介绍在pandas中,如何基于一个键值为类别、值为列名列表的字典,为dataframe动态添加一列,该列存储每行对应类别的指定列中的最小值。方法灵活支持缺失列容错与列名溯源。
本文介绍在pandas中,如何基于一个键值为类别、值为列名列表的字典,为dataframe动态添加一列,该列存储每行对应类别的指定列中的最小值。方法灵活支持缺失列容错与列名溯源。
在实际数据处理中,我们常遇到“按行分组逻辑”——即每一行属于某类(如 Item1 或 Item2),而该类对应的参与计算的列并不固定,而是由外部字典定义。例如:my_dict = {'Item1': ['Col1', 'Col3'], 'Item2': ['Col2', 'Col4']} 表明:当 Col0 == 'Item1' 时,应在 'Col1' 和 'Col3' 中取最小值;当为 'Item2' 时,则在 'Col2' 和 'Col4' 中取最小值。
直接使用 df.columns.isin(my_dict) 无法生效,因为 my_dict.keys() 是字符串(如 'Item1'),而 df.columns 是列名(如 'Col1'),二者语义不同,不能直接匹配。正确思路是:逐行读取类别标识(如 r['Col0']),查字典获取应参与计算的列名列表,再从当前行中提取这些列的值并求最小值。
推荐使用 df.apply(..., axis=1) 配合 lambda 函数实现:
import pandas as pdmy_dict = { 'Item1': ['Col1', 'Col3'], 'Item2': ['Col2', 'Col4']}df = pd.DataFrame({ 'Col0': ['Item1', 'Item2'], 'Col1': [20, 25], 'Col2': [89, 15], 'Col3': [26, 30], 'Col4': [40, 108], 'Col5': [55, 2]})df['min'] = df.apply(lambda r: r[my_dict.get(r['Col0'], [])].min(), axis=1)
✅ 输出结果:
Col0 Col1 Col2 Col3 Col4 Col5 min0 Item1 20 89 26 40 55 201 Item2 25 15 30 108 2 15
⚠️ 注意事项:
- 若字典中引用了 DataFrame 中不存在的列(如 'Col6'),上述基础写法会报 KeyError。为增强鲁棒性,可加入存在性校验:
df['min'] = df.apply( lambda r: r[[col for col in my_dict.get(r['Col0'], []) if col in r.index]].min(), axis=1)
- 若还需返回取得最小值的具体列名,可结合生成 (value, column_name) 元组并使用 min() 比较(默认按元组首元素排序):
df[['min', 'name']] = df.apply( lambda r: min((r[col], col) for col in my_dict.get(r['Col0'], []) if col in r.index), axis=1, result_type='expand')
? 总结:该方案核心在于“行级上下文驱动列选择”,避免了预定义列筛选的硬编码缺陷,兼具可读性与扩展性,适用于配置化、多模板或多品类的动态指标计算场景。
相关文章
- 无限暖暖2.1版本下半奇迹之冠巅峰赛通关指南 06-27
- 逆战未来收藏室解锁攻略 06-27
- 逆战未来武器强度榜分析一览 06-27
- 心动小镇园艺怎么快速升级 06-27
- 息风谷战略邪线结局攻略 06-27
- 心动小镇水豚吃什么食物 06-27