Вы можете использовать statistics.mode
, что повышает StatisticsError
, если не существует уникального режима.
from statistics import mode, StatisticsError
def moder(x):
try:
return mode(x)
except StatisticsError:
return None
res = df.groupby('A')['B'].apply(moder)\
.dropna().reset_index()
print(res)
A B
0 1 cat
1 3 donkey
Сравнение производительности
Хотя все 3 метода подходят для вашей задачи, они имеют незначительную разницу в производительности.
Результаты бенчмаркинга:
df = pd.concat([df]*10000)
%timeit jpp(df) # 18.3 ms ± 414 µs per loop
%timeit cs1(df) # 28.1 ms ± 558 µs per loop
%timeit cs2(df) # 24.5 ms ± 595 µs per loop
Код бенчмаркинга:
from statistics import mode, StatisticsError
def moder(x):
try:
return mode(x)
except StatisticsError:
return None
def foo(x):
m = pd.Series.mode(x)
if len(m) == 1:
return m
def jpp(df):
return df.groupby('A')['B'].apply(moder)\
.dropna().reset_index()
def cs1(df):
i = df.groupby('A').B.apply(pd.Series.mode).reset_index(level=1, drop=True)
return i[i.groupby(level=0).transform('count') == 1].reset_index()
def cs2(df):
return df.groupby('A').B.apply(foo).reset_index(level=1, drop=True).reset_index()