Панды получают первое значение в алфавитном порядке каждой группы

Предположим, у меня есть фрейм данных:

df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'bar'],
    'B': ['A', 'C', 'F', 'B', 'D']
})

И я пытаюсь получить первое алфавитное значение каждой группы.

Когда я попробовал это

df['B'] = df.groupby('A')['B'].transform('first')
 

я получу такой результат

    A   B
0   foo A
1   foo A
2   bar F
3   bar F
4   bar F

Что мне следует сделать, чтобы получить такой результат?

    A   B
0   foo A
1   foo A
2   bar B
3   bar B
4   bar B

🤔 А знаете ли вы, что...
Python используется в научных вычислениях и обработке изображений с использованием библиотеки OpenCV.


1
61
3

Ответы:

import pandas as pd

df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'bar'],
    'B': ['A', 'C', 'F', 'B', 'D']
})

# Use the `min` function to get the first alphabetically sorted value for each group
df['B'] = df.groupby('A')['B'].transform('min')

print(df)


Решено

IIUC, сначала отсортируйте свой фрейм данных, затем сгруппируйте его и позвольте pandas использовать внутреннее выравнивание индекса, чтобы согласовать ваши результаты с исходным фреймом данных:

df['new_b'] = df.sort_values('B').groupby('A')['B'].transform('first')

Выход:

     A  B new_b
0  foo  A     A
1  foo  C     A
2  bar  F     B
3  bar  B     B
4  bar  D     B

Первая буква в алфавитном/лексикографическом порядке — min:

df['B'] = df.groupby('A')['B'].transform('min')

Выход:

     A  B
0  foo  A
1  foo  A
2  bar  B
3  bar  B
4  bar  B

Предполагая смешанный случай, вы можете использовать:

df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'bar'],
    'B': ['A', 'C', 'F', 'b', 'D']
})

df['B'] = df['B'].str.upper().groupby(df['A']).transform('min')

Или, если вы хотите сохранить исходный регистр:

df['B'] = (df.sort_values(by='B', key=lambda x: x.str.upper())
             .groupby('A').transform('first')
          )

Выход:

     A  B
0  foo  A
1  foo  A
2  bar  b
3  bar  b
4  bar  b