【问题标题】:How to find min after a max value in DataFrame python?如何在DataFrame python中的最大值之后找到最小值?
【发布时间】:2021-05-11 12:41:48
【问题描述】:

想象一下以下数据集:

data = {"row1":[1,2,3,4,5], "row2" : [2,3,4,1,3], "row3":[3,4,2,0,0] }
data = pd.DataFrame(data)
data = data.T
print(data)


      0  1  2  3  4
row1  1  2  3  4  5
row2  2  3  4  1  3
row3  3  4  2  0  0

我想找到出现在max value 之后的min value。所以在最大值之前存在的任何最小值都不是我感兴趣的。 我写了这段代码:

data["Max_Value"] = data.max(axis=1)
data["Max_Index"] = data.idxmax(axis=1)

dt["Min_Value"] = dt.iloc[:, dt["Max_Index"]:].min(axis=1)
dt["Min_Index"] = dt.iloc[:, dt["Max_Index"]:].idxmin(axis=1)

dt["Max_Index"]:] 是我尝试以动态方式获取最大值索引。那么我可以找到出现在数据集那部分之后的最小值。但它并没有按我的意愿工作。

我希望得到如下结果:

      0  1  2  3  4  Max_Value   Max_Index  Min_Value  Min_Index
row1  1  2  3  4  5      5           4         5          4
row2  2  3  4  1  3      4           2         1          3
row3  3  4  2  0  0      4           1         0          3

它不起作用,我也不想使用循环,我的错误是什么?

【问题讨论】:

  • row1 的最小值应该是 1 而不是 5。请参阅我的回复
  • @JoeFerndz 我正在寻找最大值之后的最小值。在第一行中,最大值为 5,我正在寻找 5(包括 5)之后数字的最小值
  • 到目前为止你尝试过的结果是什么?你只说“它不像我打算的那样工作”

标签: python dataframe max min


【解决方案1】:

根据最大值动态获取最小值和索引

要根据行中的最大值获取最小值及其索引,您需要将行中的数据提取为列表。然后对列表进行操作,得到最小值和索引值。

为此,您可以使用以下代码:

import pandas as pd
data = {"row1":[1,2,3,4,5], "row2" : [2,3,4,1,3], "row3":[3,4,2,0,0] }
data = pd.DataFrame(data)
data = data.T
print(data)
data["Max_Value"] = data.max(axis=1)
data['Max_Val_Index'] = data.iloc[:5].idxmax(axis=1)

def custom_find_min(x):
    y = x[x.index(x[5]):5]
    return min(y)
def custom_find_min_idx(x):
    y = x[x[6]:5]
    return x.index(x[5]) + y.index(x[-1])

data["Min_Value"]   = data.apply(lambda x: custom_find_min(x.tolist()),axis=1)
data["Min_Val_Idx"] = data.apply(lambda x: custom_find_min_idx(x.tolist()),axis=1)

print (data)

或者,您可以跳过函数定义并在同一行中完成所有操作。这是它的代码:

data["Min_Value"] = data.apply(lambda x: min(x.tolist()[x['Max_Val_Index']:5]),axis=1)
data["Min_Val_Index"] = data.apply(lambda x: x['Max_Val_Index'] + x.tolist()[x['Max_Val_Index']:5].index(x['Min_Value']),axis=1)

这个输出将是:

原始数据框:

      0  1  2  3  4
row1  1  2  3  4  5
row2  2  3  4  1  3
row3  3  4  2  0  0

使用 Max、Max Index、Dynamic Min、Dynamic Min Index 更新 DataFrame。

      0  1  2  3  4  Max_Value  Max_Val_Index  Min_Value  Min_Val_Idx
row1  1  2  3  4  5          5              4          5            4
row2  2  3  4  1  3          4              2          1            3
row3  3  4  2  0  0          4              1          0            3

为了保留历史,我保留了以下部分。

编辑版本 #1:连续获取最小值和最大值

回答早期版本的问题。找出每一行的最小值和最大值

你应该使用 iloc 并给出列的范围。

import pandas as pd
data = {"row1":[1,2,3,4,5], "row2" : [2,3,4,1,3], "row3":[3,4,2,0,0] }
data = pd.DataFrame(data)
data = data.T
print(data)
data["Max_Value"] = data.max(axis=1)
data['Max_Val_Index'] = data.iloc[:5].idxmax(axis=1)
data["Min_Value"] = data.min(axis=1)
data['Min_Val_Index'] = data.iloc[:5].idxmin(axis=1)
print (data)

原始数据框:

      0  1  2  3  4
row1  1  2  3  4  5
row2  2  3  4  1  3
row3  3  4  2  0  0

使用 Min、Max 和 idx 更新 DataFrame 以获取 Min 和 Max。

      0  1  2  3  4  Max_Value  Max_Val_Index  Min_Value  Min_Val_Index
row1  1  2  3  4  5          5              4          1              0
row2  2  3  4  1  3          4              2          1              3
row3  3  4  2  0  0          4              1          0              3

【讨论】:

  • data['Max_Val_Index'] = data.iloc[:5].idxmax(axis=1) 这一行中的 5 是什么?像 5 这样的索引应该是动态获得的。当他试图通过dt["Max_Index"]获得它时!
  • 我对我的问题进行了一些澄清,所以现在更清楚我在寻找什么。请再读一遍。实际上,您的解决方案不是我问题的答案。
  • 解决方案是我上一个问题的答案。我将更新我的答案以显示正确的结果。在此期间,我将撤回答案。看起来您更改了整体问题以引用动态部分。如果问题发生了变化,如果没有反对意见,我将不胜感激。你原来的问题只有这个声明I want to find the min value after the max value so I have written this code:
  • 他想要最小值,从 max_value 的索引开始。在您的回答中,在第一行,min 应该是 5,因为他无法进一步搜索。 5 在最后一列。
  • @LoukasPap,理解并且问题已更新。我将很快发布我的回复。几分钟。得到这个解决方案并不复杂
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2012-06-21
相关资源
最近更新 更多