#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