想象以下数据集:
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
它不起作用,我也不想使用循环,我的错误是什么?
根据最大值动态获取最小值和索引
要基于一行中的最大值获得最小值及其索引,您需要将该行中的数据作为列表提取出来。然后对列表进行操作,得到最小值和索引值。
要做到这一点,可以使用下面的代码: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)
这个的输出将是:
原始DataFrame:
0 1 2 3 4
row1 1 2 3 4 5
row2 2 3 4 1 3
row3 3 4 2 0 0
update DataFrame with Max, Max Index, Dynamic Min, Dynamic Min Index.
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
为了保留历史记录,我保留了下面的部分。
Edit ver# 1: Get Min &
回答问题的早期版本。找到最小值& &;每一行的最大值
您应该使用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)
原始DataFrame:
0 1 2 3 4
row1 1 2 3 4 5
row2 2 3 4 1 3
row3 3 4 2 0 0
更新DataFrame与最小,最大和idx为Min &马克斯。
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