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

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

В моем наборе данных индекс строк 5,10,12,101 повторяется 3 раза в той же последовательности (Для FX, FY и FZ).Поэтому мой вывод должен показывать 2 самых больших значения для каждой группы FX, FY, FZ.Если мой индекс строки (5,10,12,101) повторяется 'n' раз в той же последовательности, на выходе должно отображаться 'n' Макс.значения для FX, FY и FZ.

Dataframe

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

df = df.set_index('Ele_Num')
a = int(input("Enter total number of groups: "))

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 = ['Ele_Num','Column','Values']

print (df1)

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

for i in range (1,a+1):

    print (df1.loc[i])

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

2 Largest Values from FX:
   Element No   Column  Values
1           5  E_at_20      56
1          10  E_at_0      -53

2 Largest Values from FY:
    Element No   Column  Values
2          101  E_at_10     -52
2          101  E_at_20      43

2 Largest Values from FZ:
   Element No   Column  Values
3         101   E_at_10      71
3          10   E_at_30     -63


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

   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
   Element No   Column  Values
1           5  E_at_20      56
1          10   E_at_0     -53

   Element No   Column  Values
2         101  E_at_10     -71
2          10  E_at_30      63

1 Ответ

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

Если есть только 3 или несколько групп, я предлагаю создать словарь для отображения:

d = {1:'FX', 2:'FY', 3:'FZ'}

for i in range (1,a+1):
    print (d[i]) 
    print (f'{a} Largest Values from {d[i]}')
    print (df1.loc[i])
...