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

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

My Dataset

df = pd.DataFrame({'E_at_0': [43, -53, 45, -17, 45, 19, 11, 32, 36, 32], 
                   'E_at_10': [-47, 47, 46, -18, 53, 16, 12, 34, -71, -34], 
                   'E_at_20': [56, 43, 41, 29, 36, 14, 13, -37, 43, 38], 
                   'E_at_30': [-46, 16, -40, 31, 42, 15, 63, -39, 52, 39]}, index=[5, 10, 12, 101, 4100, 5, 10, 12, 101, 4100])

df.index.name='Ele_Num'

Столбец Ele_num - это мой столбец индекса.

Индексы строкбудет повторяться в течение 'n'number раз.Для каждого «n-го» набора данных мне нужны 2 самых больших значения и их позиции в индексе.

код использует панды

df = pd.read_csv ('trial.csv')

df = df.set_index('Ele_Num')

s = df.abs().stack()

mask = s == s.max()

df1 = df.stack()[mask].reset_index()

df1.columns = ['Element No','Column','Values']

print (df1)

df1.to_csv('trial_output.csv', encoding='utf-8', index=True)

Ожидаемые результаты:

Для 1-го наборастроки (т. е. для индекса 5,10,12,101,4100)

                    Ele_Num   E_at_20
                      5          56

для 2-го набора строк (т.е. для индекса 5,10,12,101,4100)

                    Ele_Num   E_at_10
                      101       -71

строкаИндексы будут повторяться 'n'number раз.Для каждого n-го набора данных мне нужны 2 самых больших значения и их позиции в индексе.

Фактические результаты:

What I am getting

  Ele_Num   E_at_30
    101       -71

1 Ответ

1 голос
/ 14 мая 2019

Используйте argsort в порядке убывания для позиций с абсолютными значениями и используйте его для выбора суммированных значений без абс:

N = 4
s = df.abs().stack()
df1 = df.stack().iloc[np.argsort(-s)].head(N).reset_index()
df1.columns = ['Element No','Column','Values']
print (df1)
   Element No   Column  Values
0         101  E_at_10     -71
1          10  E_at_30      63
2           5  E_at_20      56
3          10   E_at_0     -53
...