如何为Pandas DataFrame添加字典指定列的每行最小值列?
解决方案
错误原因分析
你尝试的代码逻辑有误:my_dict的键是Item名称(如Item1、Item2),而非DataFrame的列名,因此df.columns.isin(my_dict)无法匹配到需要计算最小值的目标列,同时也没有关联每行Col0对应的Item所指定的列集合。
实现方法
方法一:逐行处理(直观易懂)
通过apply函数逐行获取当前Item对应的列名列表,提取该行对应列的值并计算最小值:
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 row: row[my_dict[row['Col0']]].min(), axis=1) print(df)
运行结果:
Col0 Col1 Col2 Col3 Col4 Col5 min 0 Item1 20 89 26 40 55 20 1 Item2 25 15 30 108 2 15
方法二:向量化操作(适合大数据集)
如果DataFrame行数较多,apply效率较低,可通过列映射+转长格式+分组计算的方式实现,利用pandas向量化操作提升性能:
# 构建列名到对应Item的映射字典 col_to_item = {col: item for item, cols in my_dict.items() for col in cols} # 提取目标列并转换为长格式 melted_df = df.melt(id_vars='Col0', value_vars=col_to_item.keys(), var_name='col', value_name='val') # 筛选每行Item对应的列数据,分组计算最小值 min_values = melted_df[melted_df['Col0'] == melted_df['col'].map(col_to_item)].groupby(df.index)['val'].min() # 将结果合并到原DataFrame df['min'] = min_values
内容的提问来源于stack exchange,提问作者Евгения
相关产品推荐
相关产品推荐

