Pandas groupby получает наименьшую строку - PullRequest
3 голосов
/ 15 апреля 2020

У меня есть следующий фрейм данных:

df = pd.DataFrame({'id': 3*['a']+4*['b'], 'name':['al', 'qwer', 'l', 'ewdbd', 'op', 'qsde', 'knmkln']})
id    name
 a      al
 a    qwer
 a       l
 b   ewdbd
 b      op
 b    qsde
 b  knmkln

Я хочу сгруппировать идентификатор и получить самую короткую строку в имени, если есть несколько строк с минимальной длиной, это может быть любой, конечный фрейм данных будет:

id    name
a      l
b      op

Как этого достичь?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Использование assign с drop_duplicates, в большинстве случаев это должно быть быстрее, чем groupby:

(df.assign(length=df['name'].str.len())
.sort_values('length')
.drop_duplicates('id')
.drop(columns='length')
)

или без операции drop, которая относительно медленная, как Ben.T отмечено в комментариях:

df.loc[df['name'].str.len().sort_values().index].drop_duplicates(subset='id')

  id name
2  a    l
4  b   op
2 голосов
/ 15 апреля 2020

Для самых коротких самых коротких строк вы хотите сначала найти длины:

df.loc[df['name'].str.len().groupby(df['id']).idxmin()]

Вывод:

  id name
2  a    l
4  b   op
...