Создайте фрейм данных с именем строки, именем столбца и максимальным значением столбца - PullRequest
3 голосов
/ 20 апреля 2019

Я изучаю видео пакет, который я купил у PACKT, чтобы выучить панд.Автор использовал стиль jijna2 (), чтобы выделить максимальное значение в каждом столбце.Я быстро обнаружил, что не могу использовать эту технику в PyCharm.Поэтому я решил извлечь значения.

То, что я пытаюсь сделать, - это создать три столбца данных, извлекая индекс строки, имя столбца и максимальное значение столбца из кадра данных с N столбцами, а затем создайте новыйdataframe.Новый информационный кадр будет показывать каждую строку (если есть связи, отображать все соответствующие строки), столбец и максимальное значение в этом столбце.

Я создал игрушечный информационный кадр только для проработки кода.

Мой код ниже, вместе с выводом и в самом низу, это то, что я действительно хочу, чтобы новый фрейм данных выглядел.

Я знаю, что использую заявление для печати.Этот код - единственная вещь, которую я использовал до сих пор, которая правильно выбирает несколько строк, если у меня есть связь.

Я беру всю строку, которая мне не нужна.Я также не уверен, как построить предложенный новый фрейм данных из извлеченных данных.

import pandas as pd


raw_data = {
            'dogs': [42, 39, 86, 15, 23, 57, 68, 81, 86],
            'cats': [52, 41, 79, 80, 34, 47, 19, 22, 59],
            'sheep': [62, 37, 84, 51, 67, 32, 23, 89, 73],
            'lizards': [72, 43, 36, 26, 53, 88, 88, 34, 69],
            'birds': [82, 35, 77, 63, 18, 12, 45, 56, 58],
            }

df = pd.DataFrame(raw_data,
                  index=pd.Index(['row_1', 'row_2', 'row_3', 'row_4', 'row_5', 'row_6', 'row_7', 'row_8', 'row_9'], name='Rows'),
                  columns=pd.Index(['dogs', 'cats', 'sheep', 'lizards', 'birds'], name='animals'))

print(df)
print()

# Get a list of all columns names
cols = df.columns
print(cols)
print('*****')

for col in cols:
    print((df[df[col] == df[col].max()]))


'''
animals  dogs  cats  sheep  lizards  birds
Rows                                      
row_3      86    79     84       36     77
row_9      86    59     73       69     58
animals  dogs  cats  sheep  lizards  birds
Rows                                      
row_4      15    80     51       26     63
animals  dogs  cats  sheep  lizards  birds
Rows                                      
row_8      81    22     89       34     56
animals  dogs  cats  sheep  lizards  birds
Rows                                      
row_6      57    47     32       88     12
row_7      68    19     23       88     45
animals  dogs  cats  sheep  lizards  birds
Rows                                      
row_1      42    52     62       72     82
'''

row_3     dogs        86
row_9     dogs        86
row_4     cats        80
row_8     sheep       89
row_6     lizards     88
row_7     lizards     88
row_1     birds       82

Ответы [ 2 ]

3 голосов
/ 20 апреля 2019

Вы можете проверить, используя .where и eq to mask значение no m a x как NaN, тогда stack

df.where(df.eq(df.max())).stack().sort_index(level=1).reset_index()
    Rows  animals     0
0  row_3     dogs  86.0
1  row_9     dogs  86.0
2  row_4     cats  80.0
3  row_8    sheep  89.0
4  row_6  lizards  88.0
5  row_7  lizards  88.0
6  row_1    birds  82.0
1 голос
/ 20 апреля 2019

Используйте numpy.where для индексов для совпадающих max es и создавайте новые DataFrame путем индексации - лучше, если производительность важна для больших DataFrame:

c, r = np.where(df.eq(df.max()).T)
df = pd.DataFrame({'idx':df.index[r], 'cols':df.columns[c], 'vals': df.values[r, c]})
print(df)
     idx     cols  vals
0  row_3     dogs    86
1  row_9     dogs    86
2  row_4     cats    80
3  row_8    sheep    89
4  row_6  lizards    88
5  row_7  lizards    88
6  row_1    birds    82

Еще одно решение для панд с DataFrame.unstack и GroupBy.transform для сравнения max значений для групп по первому уровню:

s = df.unstack()
df = s[s.groupby(level=0).transform('max').eq(s)].reset_index(name='vals')
print(df)
   animals   Rows  vals
0     dogs  row_3    86
1     dogs  row_9    86
2     cats  row_4    80
3    sheep  row_8    89
4  lizards  row_6    88
5  lizards  row_7    88
6    birds  row_1    82
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...