Как найти одно наибольшее значение из всех массивов строк и столбцов в Python, а также показать его индекс строки и столбца - PullRequest
1 голос
/ 14 мая 2019

Я новичок в питоне.Я хочу найти одно наибольшее значение из сетки, а также показать соответствующую метку индекса строки и столбца в выводе. Значение должно быть абсолютным.(Независимо от знака + или -) Моя структура данных похожа на показанное изображение: Мой набор данных

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()), но он показывает максимальное значение для каждой строки и толькоположительные значения.Я хочу абсолютное максимальное значение.

Ожидаемые результаты: что я хочу получить на выходе

EleNo.: 2536

Exat30 : -38

Фактический результат: что я получаю на выходе

Element No. 3562

Exat0:  20

Exat10: 36

Exat20: 33

Exat30: 38

Exat40: 34

Exat50: 20

Ответы [ 3 ]

2 голосов
/ 14 мая 2019

Используйте 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.abs, DataFrame.stack и индексами максимального значения Series.idxmax:

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

Последний выбор DataFrame.loc:

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

EDIT:

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 голос
/ 14 мая 2019

Ваша проблема в том, что вы забыли сообщить пандам, что столбец 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
1 голос
/ 14 мая 2019

Используйте комбинацию 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 () дважды, чтобы получить максимальное значение в фрейме данных, изатем вырезать строки и столбцы с нан.

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
...