商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何根据字典映射动态计算每行指定列的最小值

如何根据字典映射动态计算每行指定列的最小值

  发布于2026-06-24 阅读(0)

扫一扫,手机访问

这篇文章聊一聊在pandas中如何根据一个字典映射,为DataFrame动态添加一列。这个字典的键是类别,值是该类别对应的列名列表。核心目标是:根据每一行的类别,从该行对应的列中抓出最小值。而且这个方法还得灵活,能容忍缺失列,甚至能告诉你最小值具体是从哪一列里算出来的。
现实中的数据处理,常常会遇到这样的场景:每一行的数据属于一个特定的类别,而这个类别决定了我们应该从哪些列里去取值计算。换句话说,计算逻辑是跟着行走的,不是固定的。 举个例子,假设我们有这样一个字典: `my_dict = {'Item1': ['Col1', 'Col3'], 'Item2': ['Col2', 'Col4']}` 它的意思是:如果某一行的`Col0`列的值是`'Item1'`,那么就应该用这一行的`Col1`和`Col3`列的值来计算;如果值是`'Item2'`,那就要用`Col2`和`Col4`列的值。我们的目标,就是算出每行在这些指定列中的最小值。 你可能会想,直接拿`df.columns.isin(my_dict)`来试试?这里得留个心:`my_dict`的键(如`'Item1'`)是类别字符串,而`df.columns`是列名(如`'Col1'`),这俩是两码事,不能直接划等号。 正确的思路很清晰:逐行读取类别标识(比如`r['Col0']`),然后拿着这个类别去字典里查它对应的列名列表,最后在当前行里把这些列的值拽出来,求个最小值。 这是一个典型的“行级上下文驱动列选择”问题。比较推荐的实现方式是用`df.apply(..., axis=1)`配合一个`lambda`函数,代码非常简洁:
import pandas as pd

my_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  min
0  Item1    20    89    26    40    55   20
1  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)
**第二,如果想追溯这个最小值是从哪一列算出来的。** 有时候光拿到最小值还不够,业务可能还要求知道这个最小值对应的是哪个列名。这时候可以稍微升级一下思路,把(数值,列名)打包成元组,让`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')
这样一来,结果里就会多出一列,告诉你每一行的最小值分别是哪个列贡献的。 这个方案的核心,其实就在于把计算逻辑和行级数据绑定在了一起,避免了死板地提前定义好要筛选什么列。可读性好,扩展性也强。对于那些配置化、多模板或者多品类的动态指标计算场景来说,这算是一个相当趁手的工具。
本文转载于:https://www.php.cn/faq/2696562.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注