Во время вычисления среднего значения столбца в фрейме данных, содержащего пропущенные значения

#python #pandas #statistics #data-science #missing-data

Вопрос:

Давайте возьмем пример. предположим, что у нас есть фрейм данных с именем столбца «f1»

f1 : {2, 4, NaN, 1, NaN, 15}

и когда мы применяем к нему вменение вины, мы пишем такой код

 dataframe['f1'].fillna(dataframe['f1'].mean())
 

так что мои сомнения, когда он вычисляет среднее значение F1 во время класса DataFrame[‘Ф1’].имею в виду() я знаю, что это исключает NaN значение в ходе суммирования(в числителе), потому что они не могут быть добавлены, но я хочу знать, это может быть включены или исключены в знаменатель при делении на общее количество значений.

среднее вычисляется следующим образом

среднее значение(f1) = (2 4 1 15)/6(включить NaN в общее количество значений)

или вот так

среднее значение(f1) = (2 4 1 15)/4(исключить NaN из общего числа значений)

кроме того, объясните, почему? заранее спасибо

Ответ №1:

Согласно официальной документации pandas.Параметр DataFrame.mean «skipna» исключает значения NA/null. Если бы он был исключен из числителя, но из знаменателя, это было бы указано исключительно в документации. Вы могли бы сами доказать, что он исключен из знаменателя, проведя простой эксперимент с фиктивным фреймом данных, подобным тому, который вы привели в качестве примера в вопросе.

Причина, по которой значения NA/null должны быть исключены из знаменателя, заключается в том, чтобы быть статистически корректными. Среднее значение — это сумма чисел, деленная на их общее количество. Если вы не смогли добавить значение к суммированию, то бессмысленно делать для него дополнительный подсчет в знаменателе. Если вы посчитаете это в знаменателе, это будет равно поведению, как если бы значение NA/null было равно 0. Однако значение не равно 0, оно неизвестно, ненаблюдаемо, скрыто и т.д.

Если вы на практике осведомлены о характере распределения, вы можете интерполировать или заполнить значения NA/null соответственно характеру распределения, а затем взять среднее значение всех значений. Например, если вы понимаете, что рассматриваемая функция имеет линейную природу, вы можете интерполировать отсутствующие значения с помощью «линейного» подхода.

Ответ №2:

pd.Series.mean вычисляет среднее значение только для значений, отличных от NaN, поэтому для приведенных выше данных среднее значение равно (2 4 1 15)/4=5.5 4-это число значений , отличных от NaN, это поведение по умолчанию для расчета mean . Если вы хотите включить среднее значение для данного ряда, используя все строки в качестве знаменателя, вы можете fillna(0) перед вызовом mean() :

Звоню mean() напрямую:

 df['f1'].fillna(df['f1'].mean())
0     2.0
1     4.0
2     5.5   <------
3     1.0
4     5.5   <------
5    15.0
Name: f1, dtype: float64
 

зову mean() после fillna(0) :

 df['f1'].fillna(df['f1'].fillna(0).mean())
0     2.000000
1     4.000000
2     3.666667   <------
3     1.000000
4     3.666667   <------
5    15.000000
Name: f1, dtype: float64