Python实现:按行返回最小值及其对应左侧列关联项
提取DataFrame每行最小值及对应左侧关联项
我已经实现了按行返回DataFrame中的最小值,但还想同时返回该最小值对应的关联项——也就是最小值所在列左侧紧邻列的内容。
示例DataFrame
import pandas as pd df = pd.DataFrame({ 'Item1': ['A', 'B', 'C', 'D'], 'Value1': [1,4,5,7], 'Item2': ['F', 'G', 'H', 'I'], 'Value2': [0,4,8,12], 'Item3': ['K', 'L', 'M', 'N'], 'Value3': [2.7,3.4,6.2,8.1], })
现有代码
c = ['Value1', 'Value2', 'Value3'] x, y = range(len(df)), df[c].idxmin(1) df['Min_Value'] = df.values[x, df.columns.get_indexer_for(y)]
期望输出
Item1 Value1 Item2 Value2 Item3 Value3 Min_Item Min_Value 0 A 1 F 0 K 2.7 F 0.0 1 B 4 G 4 L 3.4 L 3.4 2 C 5 H 8 M 6.2 C 5.0 3 D 7 I 12 N 8.1 D 7.0
解决方案
利用列名的对应关系(ValueX对应左侧的ItemX),通过字符串替换拿到关联项的列名,再用lookup提取值:
c = ['Value1', 'Value2', 'Value3'] # 获取每行最小值所在的Value列名 min_value_cols = df[c].idxmin(1) # 转换为对应的Item列名 min_item_cols = min_value_cols.str.replace('Value', 'Item') # 提取最小值和关联项 df['Min_Value'] = df.lookup(df.index, min_value_cols) df['Min_Item'] = df.lookup(df.index, min_item_cols) # 调整列顺序(可选,匹配期望输出的列顺序) df = df[['Item1', 'Value1', 'Item2', 'Value2', 'Item3', 'Value3', 'Min_Item', 'Min_Value']] print(df)
说明
min_value_cols.str.replace('Value', 'Item'):根据列名的命名规则,直接将最小值所在的Value列转换为对应的Item列。df.lookup():通过行索引和列名的组合,高效提取对应位置的值,比直接操作df.values更简洁易读。
内容的提问来源于stack exchange,提问作者tonydanza123
相关产品推荐
相关产品推荐

