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

2024-10-02 16:23:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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

Tags: in网格数据结构output符号标签what行和列
3条回答

你的问题是你忘记告诉熊猫,EleNo.列是索引。在这一点之后,事情就简单了:只需要用每一行的绝对值的最大值构建一个序列,取该序列的最大值的索引,并用它在原始数据帧中找到所需的行。代码可以是:

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

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

显示如预期:

   EleNo.  Exat0  Exat10  Exat20  Exat30  Exat40  Exat50
1    2536    -20     -36     -33     -38       2     -10

使用^{}作为索引,并通过具有索引的构造函数创建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

另一个只有^{}^{}^{}的最大值索引的解决方案:

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

最后一个选择者^{}

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

结合使用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

相关问题 更多 >