Добавьте минимальное значение группы только в последний ряд группы с пандами - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь вычислить минимальное значение 2-го столбца, который принадлежит определенным значениям 1-го столбца. поэтому мой фрейм данных выглядит следующим образом:

name        CEMS    star
ACC         CEMS-1  3
ACC         CEMS-2  4
ACC         CEMS-3  5
ACC         CEMS-4  5
ARTi        CEMS-1  4
ARTi        CEMS-2  5
ARTi        CEMS-3  4
ARTi        CEMS-4  5

Теперь я хочу найти минимальное звездное значение для каждого имени в отдельном столбце из разных значений CEMS

Я хочу, чтобы мой фрейм данных выглядел так:

Name            CEMS    star  min
ACC         CEMS-1        3    
ACC         CEMS-2        4     
ACC         CEMS-3        5     
ACC         CEMS-4        5     3
ARTi        CEMS-1        4     
ARTi        CEMS-2        5     
ARTi        CEMS-3        4     
ARTi        CEMS-4        5     4

Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Чтобы изменить только последнее значение, как в ожидаемом выводе

ind = df.groupby('name', as_index=False).apply(lambda s: s.index[-1])
df.loc[ind, 'min'] = df.groupby('name').star.min().values

    name    CEMS    star    min
0   ACC     CEMS-1  3       NaN
1   ACC     CEMS-2  4       NaN
2   ACC     CEMS-3  5       NaN
3   ACC     CEMS-4  5       3.0
4   ARTi    CEMS-1  4       NaN
5   ARTi    CEMS-2  5       NaN
6   ARTi    CEMS-3  4       NaN
7   ARTi    CEMS-4  5       4.0
0 голосов
/ 10 сентября 2018

transform недостаточно. Вам нужно будет замаскировать все, кроме последнего индекса. Для этого вы можете выполнить выравнивание по индексу.

g = df.groupby('name')['star']
df['minstar'] = pd.Series(g.min(), index=g.apply(pd.Series.last_valid_index))

df.fillna('')

   name    CEMS  star minstar
0   ACC  CEMS-1     3        
1   ACC  CEMS-2     4        
2   ACC  CEMS-3     5        
3   ACC  CEMS-4     5       3
4  ARTi  CEMS-1     4        
5  ARTi  CEMS-2     5        
6  ARTi  CEMS-3     4        
7  ARTi  CEMS-4     5       4
0 голосов
/ 10 сентября 2018

Вы можете использовать GroupBy + transform с min. Если ваш фрейм данных также отсортирован по name, вы можете использовать drop_duplicates для желаемого результата.

df['star_min'] = df.groupby('name')['star'].transform('min')\
                   .drop_duplicates(keep='last')

print(df)

   name    CEMS  star  star_min
0   ACC  CEMS-1     3       NaN
1   ACC  CEMS-2     4       NaN
2   ACC  CEMS-3     5       NaN
3   ACC  CEMS-4     5       3.0
4  ARTi  CEMS-1     4       NaN
5  ARTi  CEMS-2     5       NaN
6  ARTi  CEMS-3     4       NaN
7  ARTi  CEMS-4     5       4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...