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

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

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

Если вас не волнует относительный порядок foo/bar, то просто df = df.sort_values(["A", "B"]); df["B"] = df.groupby('A')['B'].transform('first').

STerliakov 30.08.2024 03:55

У вас есть строчные буквы, какой порядок строчных и прописных букв?

Ynjxsjmh 30.08.2024 04:09

У меня пока нет строчных букв. Но есть ли способ сортировки, несмотря на строчные/прописные буквы?

TYWu 30.08.2024 04:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Другие вопросы по теме