Получить столбец с максимальным индексом по группе в панде Dataframe - PullRequest
1 голос
/ 06 ноября 2019

У меня есть следующие данные в Pandas DataFrame

import pandas as pd

data = [['AAA','2019-01-01', 10], ['AAA','2019-01-02', 21],
        ['AAA','2019-02-01', 30], ['AAA','2019-02-02', 45],
        ['BBB','2019-01-01', 50], ['BBB','2019-01-02', 60],
        ['BBB','2019-02-01', 70],['BBB','2019-02-02', 80]]

dfx = pd.DataFrame(data, columns = ['NAME', 'TIMESTAMP','VALUE'])

  NAME   TIMESTAMP  VALUE
0  AAA  2019-01-01     10
1  AAA  2019-01-02     21
2  AAA  2019-02-01     30
3  AAA  2019-02-02     45
4  BBB  2019-01-01     50
5  BBB  2019-01-02     60
6  BBB  2019-02-01     70
7  BBB  2019-02-02     80

Можно ли создать столбец, который возвращает максимальное значение индекса в группе (например, NAME), поэтому ожидаемыйвывод выглядит следующим образом:

  NAME   TIMESTAMP  VALUE MAXIDX
0  AAA  2019-01-01     10    3
1  AAA  2019-01-02     21    3
2  AAA  2019-02-01     30    3
3  AAA  2019-02-02     45    3
4  BBB  2019-01-01     50    7
5  BBB  2019-01-02     60    7
6  BBB  2019-02-01     70    7
7  BBB  2019-02-02     80    7

Спасибо и С уважением.

Ответы [ 4 ]

4 голосов
/ 06 ноября 2019

Вы можете группировать и преобразовывать для idxmax, например:

dfx['MAXIDX'] = dfx.groupby('NAME').transform('idxmax')
1 голос
/ 06 ноября 2019

Следующий код решил мою проблему для меня, благодаря @Jon и @ Celius.

dfx.reset_index(drop=False)
dfx['MAXIDX'] = dfx.groupby('NAME')['index'].transform(max)
1 голос
/ 06 ноября 2019

В вашем примере вы можете использовать reset_index () вместе с groupby, а затем объединить его с исходным фреймом данных:

import pandas as pd

data = [['AAA','2019-01-01', 10], ['AAA','2019-01-02', 21],
        ['AAA','2019-02-01', 30], ['AAA','2019-02-02', 45],
        ['BBB','2019-01-01', 50], ['BBB','2019-01-02', 60],
        ['BBB','2019-02-01', 70],['BBB','2019-02-02', 80]]

dfx = pd.DataFrame(data, columns = ['NAME', 'TIMESTAMP','VALUE'])

dfx = dfx.reset_index(drop=False)
dfx = dfx.merge(dfx.groupby('NAME',as_index=False).agg({'index':'max'}),how='left',on='NAME').rename(columns={'index_y':'max_index'}).drop(columns='index_x')

Вывод:

NAME    TIMESTAMP   VALUE   max_index
 AAA    2019-01-01     10           3
 AAA    2019-01-02     21           3
 AAA    2019-02-01     30           3
 AAA    2019-02-02     45           3
 BBB    2019-01-01     50           7
 BBB    2019-01-02     60           7
 BBB    2019-02-01     70           7
 BBB    2019-02-02     80           7
0 голосов
/ 06 ноября 2019

я сделаю sort_values + drop_duplicates + merge

df.merge(df.sort_values('VALUE').
         drop_duplicates('NAME',keep='last')['NAME'].
         reset_index(),on='NAME')
Out[73]: 
  NAME   TIMESTAMP  VALUE  index
0  AAA  2019-01-01     10      3
1  AAA  2019-01-02     21      3
2  AAA  2019-02-01     30      3
3  AAA  2019-02-02     45      3
4  BBB  2019-01-01     50      7
5  BBB  2019-01-02     60      7
6  BBB  2019-02-01     70      7
7  BBB  2019-02-02     80      7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...