дропна первая
Вы можете dropna
в качестве начального шага перед выполнением groupby
. Если вы попытаетесь набрать dropna
в агрегации, то группа со всеми значениями NaN
может выдать ошибку с stats.mode
.
Вот минимальный пример:
import pandas as pd
import numpy as np
from scipy import stats
df = pd.DataFrame([[1, 2, np.nan], [1, 2, 'hello'], [1, 2, np.nan],
[5, 6, 'next'], [5, 6, np.nan], [5, 6, 'next'],
[7, 8, np.nan], [7, 8, np.nan], [7, 8, np.nan]],
columns=['Var1', 'Var2', 'Value'])
res = df.dropna(subset=['Value'])\
.groupby(['Var1', 'Var2'])\
.agg(lambda x: stats.mode(x)[1][0])
print(res)
Value
Var1 Var2
1 2 1
5 6 2
catch IndexError
Если вам нужно сохранить группы со всеми значениями NaN
, вы можете поймать IndexError
:
def mode_calc(x):
try:
return stats.mode(x.dropna())[1][0]
except IndexError:
return np.nan
res = df.groupby(['Var1', 'Var2'])\
.agg(mode_calc)
print(res)
Value
Var1 Var2
1 2 1.0
5 6 2.0
7 8 NaN