Предположим, у меня есть фрейм данных:
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.
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