如何在Python中从所有行和列数组中查找单个最大值,并显示其行和列索引

时间:2019-05-14 05:15:29

标签: python pandas numpy dataframe max

我是python的新手。我想从网格中找到一个最大值,并在输出中显示其各自的行和列索引标签。该值应该是绝对的。 (与+或-无关) 我的数据结构如下图所示: My data set

EleNo._ Exat0_  Exat10_ Exat20_ Exat30_ Exat40_ Exat50

1000____ 10____   20___  -30____  23_____ 28____  18

2536____-20___   -36___  -33___  -38_____ 2____  -10

3562_____ 3____    4______ 8_____  8_____ 34_____  4

2561_____ 2____    4______ 7_____  6_____ 22____  20

我尝试了(df.abs().max()),但它显示的是每一行的最大值,并且仅显示正值。我要绝对值。

预期结果: what i want in output

EleNo.: 2536

Exat30 : -38

实际结果: what i am getting in output

Element No. 3562

Exat0:  20

Exat10: 36

Exat20: 33

Exat30: 38

Exat40: 34

Exat50: 20

3 个答案:

答案 0 :(得分:2)

使用numpy.unravel_index作为索引,并通过带有索引的构造函数创建DataFrame:

df = pd.DataFrame({'Exat0': [10, -20, 3, 2], 
                   'Exat10': [20, -36, 4, 4], 
                   'Exat20': [-30, -33, 8, 7], 
                   'Exat30': [23, -38, 8, 6],
                   'Exat40': [28, 2, 34, 22], 
                   'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
df.index.name='EleNo.'
print (df)
        Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
EleNo.                                               
1000       10      20     -30      23      28      18
2536      -20     -36     -33     -38       2     -10
3562        3       4       8       8      34       4
2561        2       4       7       6      22      20

a = df.abs().values
r,c = np.unravel_index(a.argmax(), a.shape)
print (r, c)
1 3

df1 = pd.DataFrame(df.values[r, c], 
                   columns=[df.columns.values[c]], 
                   index=[df.index.values[r]])
df1.index.name='EleNo.'
print (df1)
        Exat30
EleNo.        
2536       -38

另一种只有DataFrame.absDataFrame.stack且最大值索引为Series.idxmax的熊猫解决方案:

r1, c1 = df.abs().stack().idxmax()

最后由DataFrame.loc选择:

df1 = df.loc[[r1], [c1]]
print (df1)
        Exat30
EleNo.        
2536       -38

编辑:

df = pd.DataFrame({'Exat0': [10, -20, 3, 2], 
                   'Exat10': [20, -36, 4, 4], 
                   'Exat20': [-30, -33, 8, 7], 
                   'Exat30': [23, -38, 8, 6],
                   'Exat40': [28, 2, 34, -38], 
                   'Exat50': [18, -10, 4, 20]}, index=[1000, 2536, 3562, 2561])
df.index.name='EleNo.'
print (df)
        Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
EleNo.                                               
1000       10      20     -30      23      28      18
2536      -20     -36     -33     -38       2     -10
3562        3       4       8       8      34       4
2561        2       4       7       6     -38      20

s = df.abs().stack()
mask = s == s.max()

df1 = df.stack()[mask].unstack()
print (df1)
        Exat30  Exat40
EleNo.                
2536     -38.0     NaN
2561       NaN   -38.0

df2 = df.stack()[mask].reset_index()
df2.columns = ['EleNo.','cols','values']
print (df2)
   EleNo.    cols  values
0    2536  Exat30     -38
1    2561  Exat40     -38

答案 1 :(得分:1)

结合使用max()和dropna()

首先创建一个数据框:

df = pd.DataFrame(np.random.randn(4,4))

          0         1         2         3
0  0.051775  0.352410 -0.451630 -0.452446
1 -1.434128  0.516264 -0.807776 -0.077892
2  1.615521  0.870604 -0.010285 -0.322280
3 -0.027598  1.046129 -0.165166  0.365150

计算两次max()以获得数据帧中的最大值,然后使用nan剪切出行和列。

result = df[df == abs(df).max().max()].dropna(axis=0, how="all").dropna(axis=1, how='all')

print(result)
          0
2  1.615521

最后,获取列和行的值以及最大值。

max_value = result.values.item()
max_column = result.columns.values[0]
max_row = result.index.values[0]

print('max_value', max_value, 'max_column', max_column,'max_row', max_row)

max_value 1.615520522284493 max_column 0 max_row 2

答案 2 :(得分:1)

您的问题是您忘记告诉熊猫null列是索引。在那之后,事情变得更简单了:仅用每行的绝对值的最大值构建一个序列,获取该系列的最大值的索引,然后使用它在原始数据帧中找到所需的行。代码可能是:

EleNo.

显示符合预期:

s = df.set_index('EleNo.').apply(np.absolute).max(axis=1)

print(df[df['EleNo.'] == s[s == s.max()].index[0]])