
本文介绍如何基于字典中定义的“项目→列名列表”映射关系,为 pandas dataframe 的每一行动态选取对应列并计算最小值,适用于列选择逻辑随行变化的场景。
本文介绍如何基于字典中定义的“项目→列名列表”映射关系,为 pandas dataframe 的每一行动态选取对应列并计算最小值,适用于列选择逻辑随行变化的场景。
在实际数据分析中,常遇到这样的需求:不同行(如不同类别、项目或样本)需从不同列子集中提取统计量。例如,Item1 应取 Col1 和 Col3 的最小值,而 Item2 则需比较 Col2 和 Col4 —— 这种“按行动态列选择”无法通过静态列筛选(如 df[['Col1','Col3']].min(axis=1))实现,必须结合行内容与映射规则。
核心思路是:逐行读取标识列(如 '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]
})
# ✅ 正确做法:按行查找字典,提取对应列并求 min
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
⚠️ 注意事项:
- my_dict.get(r['Col0'], []) 确保当 Col0 值不在字典中时返回空列表,避免 KeyError;
- 若字典中包含 DataFrame 中不存在的列名(如 'Col6'),直接索引会报错。此时应增加存在性校验:
df['min'] = df.apply( lambda r: r[[col for col in my_dict.get(r['Col0'], []) if col in df.columns]].min(), axis=1 )- 如需同时获取最小值及其来源列名,可利用元组解包与 result_type='expand':
df[['min', 'min_col']] = df.apply( lambda r: min((r[col], col) for col in my_dict.get(r['Col0'], []) if col in df.columns), axis=1, result_type='expand' )
该方法灵活、可读性强,且完全兼容任意映射结构与列名组合,是处理“条件化列聚合”的标准实践方案。











