Ответ 1
agg
совпадает с aggregate
. Он вызываемый пропускает столбцы (Series
objects) DataFrame
, по одному за раз.
Вы можете использовать idxmax
для сбора индексных меток строк с максимальным значением
количество:
idx = df.groupby('word')['count'].idxmax()
print(idx)
дает
word
a 2
an 3
the 1
Name: count
а затем используйте loc
, чтобы выбрать те строки в столбцах word
и tag
:
print(df.loc[idx, ['word', 'tag']])
дает
word tag
2 a T
3 an T
1 the S
Обратите внимание, что idxmax
возвращает метки индекса. df.loc
может использоваться для выбора строк
по этикетке. Но если индекс не уникален, то есть, если есть строки с повторяющимися индексными метками, то df.loc
выберет все строки с метками, указанными в idx
. Поэтому будьте осторожны, если df.index.is_unique
True
, если вы используете idxmax
с df.loc
Альтернативно, вы можете использовать apply
. apply
callable передается суб-DataFrame, который дает вам доступ ко всем столбцам:
import pandas as pd
df = pd.DataFrame({'word':'a the a an the'.split(),
'tag': list('SSTTT'),
'count': [30, 20, 60, 5, 10]})
print(df.groupby('word').apply(lambda subf: subf['tag'][subf['count'].idxmax()]))
дает
word
a T
an T
the S
Использование idxmax
и loc
обычно быстрее, чем apply
, особенно для больших DataFrames. Использование IPython% timeit:
N = 10000
df = pd.DataFrame({'word':'a the a an the'.split()*N,
'tag': list('SSTTT')*N,
'count': [30, 20, 60, 5, 10]*N})
def using_apply(df):
return (df.groupby('word').apply(lambda subf: subf['tag'][subf['count'].idxmax()]))
def using_idxmax_loc(df):
idx = df.groupby('word')['count'].idxmax()
return df.loc[idx, ['word', 'tag']]
In [22]: %timeit using_apply(df)
100 loops, best of 3: 7.68 ms per loop
In [23]: %timeit using_idxmax_loc(df)
100 loops, best of 3: 5.43 ms per loop
Если вам нужен словарь, сопоставляющий слова с тегами, вы можете использовать set_index
и to_dict
следующим образом:
In [36]: df2 = df.loc[idx, ['word', 'tag']].set_index('word')
In [37]: df2
Out[37]:
tag
word
a T
an T
the S
In [38]: df2.to_dict()['tag']
Out[38]: {'a': 'T', 'an': 'T', 'the': 'S'}