Убрать пропущенные значения в цикле
Подсчитываю точечно-биссериальный коэффициент таким кодм:
def tbk(col):
tbk_ras = stats.pointbiserialr(col, df['Общий'])
df1 = pd.DataFrame({"statistic": [tbk_ras[0]],
"pvalue": [tbk_ras[1]]})
return df1.assign(column=col.name)
res = pd.concat([tbk(df[col]) for col in df.columns], ignore_index=True)
print(res)
Код рабочий, но если есть пропущенные значения, возникают проблемы.
Например, на таких данных , где для рассчета pointbiserialr попарно берется первый столбец с каждым последующим, считаться не будет, т.к. есть пропущенные значения. Значит, в самом цикле в каждой паре столбцов нужно удалять те строки, в которых встречаются NaNs.
Я пробую это делать при помощи .isna() , но, очевидно, что-то делаю не так, потому что получаю неправильные значения.
Помогите, пожалуйста! Какой метод я могу использовать, чтобы решить свою задачу?
Ответы (1 шт):
Попробуйте создать булеву маску строк с непустыми (not NaN) значениями в функции и использовать ее для фильтрации значений обоих столбцов:
def tbk(col):
mask = col.notna()
tbk_ras = stats.pointbiserialr(col.loc[mask], df.loc[mask, 'Общий'])
df1 = pd.DataFrame({"statistic": [tbk_ras[0]],
"pvalue": [tbk_ras[1]]})
return df1.assign(column=col.name)
res = pd.concat([tbk(df[col]) for col in df.columns], ignore_index=True)
print(res)
результат:
In [113]: print(res)
statistic pvalue column
0 1.000000 0.000000e+00 Общий
1 0.306734 1.559845e-06 n1
2 0.460923 8.117419e-15 n2
3 0.529065 4.482090e-28 n3
4 0.507567 9.656675e-16 n4
5 0.583858 4.933563e-20 n5