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

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

Мой набор данных: Mydataset

df=pd.DataFrame({'0_deg': [43, 50, 45, -17, 5, 8, 9, 19, 11, 32, 36, 41, 10, 1, 19, 11, 32, 36, 1, 8, 9], 
              '10_deg': [47, 41, 46, -18, 4, 5, 11, 16, 12, 34, -52, 31, 23, 4, 16, 12, 34, -71, 2, 7, 10], 
              '20_deg': [46, 43, -56, 29, 6, 7, 10, 14, 13, 33, 43, 6, 9, -40, 14, 13, 37, 43, 3, 6, 11], 
              '30_deg': [-46, 16, -40, -11, 9, 1, 12, 15, 33, -39, -22, 21, 23, 14, 15, 63, -39, -22, 4, 5, 12]}, index=[5, 10, 12, 101, 130, 140, 150, 5, 10, 12, 101, 130, 140, 150, 5, 10, 12, 101, 130, 140, 150])

df = df.set_index('Number')
def f(x):
    x1 = x.abs().stack()
    x2 = x.stack()
    x = x2.iloc[np.argsort(-x1)].head(b)
    return x

groups = (df.index == 5).cumsum()
df1 = df.groupby(groups).apply(f).reset_index(level=[1,2])
df1.columns = ['Number','Angle','Value']
print (df1)

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

Expectedoutput

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

Actualoutput

1 Ответ

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

Вам может понадобиться два groupby фильтра

df = df.reset_index()
df['key']=df['index'].eq(5).cumsum()
s=df.melt(['key','index'])
s=s[(-s.value.abs()).groupby(s['index']).rank()==1]
# just need select max row of each index before pick two from the each group
s[(-s.value.abs()).groupby(s.key).rank()<=2].sort_values('key')
Out[672]: 
    key  index variable  value
21    1      5   10_deg     47
44    1     12   20_deg    -56
11    2    130    0_deg     41
55    2    150   20_deg    -40
38    3    101   10_deg    -71
78    3     10   30_deg     63
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...