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

Useful Image

Я новичок в Python.Я хочу найти самые большие значения из всех столбцов для повторяющихся элементов строки (т. Е. От 5 до 4100), а также показать метку индекса строки и столбца в выходных данных. Наибольшее значение должно быть абсолютным.(Независимо от знака + или -) Группа индексов строк будет повторяться в течение «n» числа раз.Для каждой «n-й» группы индекса строки, я хочу, чтобы самые большие значения и их позиции индекса для каждой группы.Например: если индекс строки группы повторяется n раз, выходные данные должны показывать значения n.

В моем наборе данных индекс строк 5,10,12,101,4100 повторяется дважды в одной и той же последовательности.Таким образом, мой вывод должен показывать 2 самых больших значения (по 1 от каждой группы).Если мой индекс строки (5,10,12,101,4100) повторяется 'n' раз в одной и той же последовательности, вывод должен отображать значения 'n' (1 значение для каждой группы строк)

Please See This Image

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

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

Ele_Num   E_at_30
  101       -71

1 Ответ

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

Вы можете создавать группы, а затем вызывать функции по группам - последний раз выбрать в выходном DataFrame по индексам с loc:

def f(x):
    x1 = x.abs().stack()
    x2 = x.stack()
    x = x2.iloc[np.argsort(-x1)].head(2)
    return x

groups = (df.index == 5).cumsum()
df1 = df.groupby(groups).apply(f).reset_index(level=[1,2])
df1.columns = ['Element No','Column','Values']
print (df1)
   Element No   Column  Values
1           5  E_at_20      56
1          10   E_at_0     -53
2         101  E_at_10     -71
2          10  E_at_30      63

print (df1.loc[1])
   Element No   Column  Values
1           5  E_at_20      56
1          10   E_at_0     -53

print (df1.loc[2])
   Element No   Column  Values
2         101  E_at_10     -71
2          10  E_at_30      63
...