Вам нужно определить свою собственную функцию.Обязательно замените пустые строки на NaN
, чтобы они никогда не рассматривались.transform
может быть сложнее с вычислениями, основанными на нескольких столбцах, поэтому вместо группирования и сопоставления результата с оригиналом.
import numpy as np
def my_mode(gp):
s = gp['name'].value_counts()
s = s[s.eq(s.max())]
if len(s) == 0: # If all missing
return np.NaN
elif len(s) == 1: # If there is a mode without ties
return s.index[0]
else: # If ties, use the one with min col2
return gp.loc[gp['name'].isin(s.index)].sort_values('col2')['name'].iloc[0]
df['name'] = df['name'].replace({'': np.NaN})
df['consensus_name'] = df['group'].map(df.groupby('group').apply(my_mode))
Вывод:
group col1 col2 name consensus_name
0 1 dog 40 canidae canidae
1 1 dog 40 canidae canidae
2 1 dog 40 canidae canidae
3 1 dog 40 canidae canidae
4 1 dog 40 NaN canidae
5 1 dog 40 canidae canidae
6 1 dog 40 canidae canidae
7 2 frog 85 dendrobatidae leptodactylidae
8 2 frog 89 leptodactylidae leptodactylidae
9 2 frog 89 leptodactylidae leptodactylidae
10 2 frog 82 leptodactylidae leptodactylidae
11 2 frog 89 NaN leptodactylidae
12 2 frog 81 NaN leptodactylidae
13 2 frog 89 dendrobatidae leptodactylidae
14 3 horse 87 equidae1 equidae3
15 3 donkey 76 equidae2 equidae3
16 3 zebra 67 equidae3 equidae3
17 4 bird 54 psittacidae psittacidae
18 4 bird 56 NaN psittacidae
19 4 bird 34 NaN psittacidae
20 5 bear 67 NaN NaN
21 5 bear 54 NaN NaN
Единственный крайний случай, который мы не определили явно, - это то, что происходит, когда есть связь для модальных значений и , которые они связывают для минимума col2.В настоящее время в этих ситуациях он выберет имя с самым низким индексом (которое появляется первым в DataFrame).