
在数据分析中,我们经常需要从 dataframe 的多列中找出每行的最小值。然而,除了最小值本身,有时我们还需要知道是哪一列或哪个“项目”对应了这个最小值。例如,在一个包含多个产品值及其对应产品名称的 dataframe 中,我们可能需要找出每行中最低的价格以及对应的产品名称。本教程将展示如何利用 pandas 的强大功能,以一种高效且优雅的方式解决这个问题。
首先,我们创建一个示例 Pandas DataFrame,其中包含数值列(如 Value1, Value2, Value3)和与之关联的非数值型列(如 Item1, Item2, Item3)。
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("原始 DataFrame:")
print(df)输出的原始 DataFrame 如下:
原始 DataFrame: 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
我们的目标是添加两列:Min_Value (每行的最小值) 和 Min_Item (对应最小值的项目名称)。
首先,我们需要确定哪些列参与最小值的比较。在这个例子中,是 Value1, Value2, Value3。
# 定义参与比较的数值列
value_cols = ['Value1', 'Value2', 'Value3']
# 使用 idxmin(axis=1) 找出每行最小值所在的列名
# 结果是一个 Series,其索引是 DataFrame 的行索引,值是最小值所在列的名称(如 'Value1', 'Value2')
min_value_col_names = df[value_cols].idxmin(axis=1)
# 获取行索引序列,用于后续的基于 NumPy 数组的索引
row_indices = range(len(df))
# 利用 df.values 和 get_indexer_for 提取最小值
# df.values 将 DataFrame 转换为 NumPy 数组,可以进行高效的整数位置索引
# df.columns.get_indexer_for(min_value_col_names) 将列名 Series 转换为对应的整数列索引 Series
df['Min_Value'] = df.values[row_indices, df.columns.get_indexer_for(min_value_col_names)]
print("\n添加 Min_Value 后的 DataFrame:")
print(df)此时 DataFrame 会新增 Min_Value 列:
添加 Min_Value 后的 DataFrame: 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
关键在于如何将 min_value_col_names (例如 'Value1') 转换为其对应的项目列名 (例如 'Item1')。这里我们可以利用字符串替换功能。
# 将最小值所在列的名称(如 'Value1')转换为对应的项目列名(如 'Item1')
# 假设项目列名和值列名之间存在 'Value' 到 'Item' 的简单映射关系
min_item_col_names = min_value_col_names.str.replace('Value', 'Item')
# 再次利用 df.values 和 get_indexer_for 提取对应的项目名称
df['Min_Item'] = df.values[row_indices, df.columns.get_indexer_for(min_item_col_names)]
print("\n最终结果 DataFrame:")
print(df)最终输出的 DataFrame 将包含 Min_Value 和 Min_Item 两列,符合我们的预期:
最终结果 DataFrame: 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
# 示例 DataFrame
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],
})
# 1. 定义参与比较的数值列
value_cols = ['Value1', 'Value2', 'Value3']
# 2. 获取每行最小值所在列的名称
# axis=1 表示按行操作
min_value_col_names = df[value_cols].idxmin(axis=1)
# 3. 获取行索引序列,用于基于 NumPy 数组的索引
row_indices = range(len(df))
# 4. 提取每行的最小值
# df.values 将 DataFrame 转换为 NumPy 数组,支持高效的整数位置索引
# df.columns.get_indexer_for() 将列名 Series 转换为对应的整数列索引 Series
df['Min_Value'] = df.values[row_indices, df.columns.get_indexer_for(min_value_col_names)]
# 5. 将最小值所在列的名称转换为对应的项目列名
# 假设项目列名和值列名之间存在 'Value' 到 'Item' 的简单映射关系
min_item_col_names = min_value_col_names.str.replace('Value', 'Item')
# 6. 提取对应的项目名称
df['Min_Item'] = df.values[row_indices, df.columns.get_indexer_for(min_item_col_names)]
print("最终处理结果 DataFrame:")
print(df)通过上述步骤,我们不仅找到了每行的最小值,还成功地提取了与之对应的关联信息,这在实际数据分析工作中是非常有用的技巧。掌握这种高效的 Pandas 索引和字符串处理方法,将大大提升你的数据处理能力。
以上就是Pandas DataFrame:高效获取行级最小值及其对应关联列值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号