
本文档旨在介绍如何使用Python的pandas库,在一个DataFrame中查找每一行的最小值,并同时获取与该最小值关联的列名。通过示例代码,我们将演示如何高效地实现这一目标,并提供必要的解释和注意事项,帮助读者理解和应用该方法。
使用pandas获取行最小值及其对应列名
在数据分析中,经常需要找出DataFrame每一行的最小值,并进一步获取该最小值对应的列名。以下提供一种简洁高效的实现方法,使用pandas库可以轻松完成此任务。
示例代码
假设我们有以下DataFrame:
立即学习“Python免费学习笔记(深入)”;
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],
})
print(df)输出:
Item1 Value1 Item2 Value2 Item3 Value3 0 A 1 F 0 K 2.7 1 B 4 G 4 L 3.4 2 C 5 H 8 M 6.2 3 D 7 I 12 N 8.1
我们的目标是找到每一行Value1, Value2, Value3中的最小值,并获取对应的Item列的值。
实现步骤
-
确定数值列: 首先,定义包含数值的列名列表。
c = ['Value1', 'Value2', 'Value3']
-
查找最小值的列索引: 使用idxmin(1)方法找到每一行最小值对应的列名。1表示按行查找。
x, y = range(len(df)), df[c].idxmin(1) print(y)
输出:
0 Value2 1 Value3 2 Value1 3 Value1 dtype: object
-
获取最小值: 使用df.values和df.columns.get_indexer_for(y)方法获取最小值。
df['Min_Value'] = df.values[x, df.columns.get_indexer_for(y)] print(df)
输出:
Item1 Value1 Item2 Value2 Item3 Value3 Min_Value 0 A 1 F 0 K 2.7 0.0 1 B 4 G 4 L 3.4 3.4 2 C 5 H 8 M 6.2 5.0 3 D 7 I 12 N 8.1 7.0
-
获取对应的Item: 将Value替换为Item,然后使用类似的方法获取对应的Item。
yi = y.str.replace('Value', 'Item') df['Min_Item'] = df.values[x, df.columns.get_indexer_for(yi)] print(df)输出:
Item1 Value1 Item2 Value2 Item3 Value3 Min_Value Min_Item 0 A 1 F 0 K 2.7 0.0 F 1 B 4 G 4 L 3.4 3.4 L 2 C 5 H 8 M 6.2 5.0 Item1 3 D 7 I 12 N 8.1 7.0 Item1
注意到,当最小值是Value1时,对应的Min_Item是Item1,但我们期望得到的是A,B等。需要对代码进行修正。
-
修正Item列的获取: 找到最小值对应列的索引后,需要根据这个索引,结合原始DataFrame的结构,来确定对应的Item列。这里可以写一个函数来实现,以避免硬编码列名。
def get_corresponding_item(row): min_value_col = row['min_value_col'] # 最小值对应的列名 item_col = min_value_col.replace('Value', 'Item') # 将Value替换为Item # 获取Item列对应的索引 item_index = df.columns.get_loc(item_col) # 返回对应的Item值 return row[item_index] # 获取每一行最小值对应的列名 df['min_value_col'] = df[c].idxmin(axis=1) # 应用函数获取对应的Item值 df['Min_Item'] = df.apply(get_corresponding_item, axis=1) df = df.drop(columns=['min_value_col']) print(df)输出:
Item1 Value1 Item2 Value2 Item3 Value3 Min_Value Min_Item 0 A 1 F 0 K 2.7 0.0 F 1 B 4 G 4 L 3.4 3.4 L 2 C 5 H 8 M 6.2 5.0 C 3 D 7 I 12 N 8.1 7.0 D
完整代码
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)]
def get_corresponding_item(row):
min_value_col = row['min_value_col'] # 最小值对应的列名
item_col = min_value_col.replace('Value', 'Item') # 将Value替换为Item
# 获取Item列对应的索引
item_index = df.columns.get_loc(item_col)
# 返回对应的Item值
return row[item_index]
# 获取每一行最小值对应的列名
df['min_value_col'] = df[c].idxmin(axis=1)
# 应用函数获取对应的Item值
df['Min_Item'] = df.apply(get_corresponding_item, axis=1)
df = df.drop(columns=['min_value_col'])
print(df)注意事项
- 确保数值列的数据类型一致,以便正确比较。
- 如果存在多个最小值,idxmin() 返回第一个出现的最小值的列名。
- get_indexer_for() 方法可以高效地获取列名对应的索引。
- 根据实际DataFrame的结构调整代码,特别是Item列的获取方式。
总结
通过上述方法,我们可以方便地获取DataFrame每一行的最小值及其对应的列名。这种方法简洁高效,适用于各种规模的数据集。在实际应用中,可以根据具体需求进行调整和优化。










