雑記

pandasのmeanとmedianの違い

pandas mean median

meanとmedianの違い

meanは平均値、medianは中央値です。以上です。

平均値と中央値の違いについてはこちらの記事がわかりやすかったのでご参考にしてください。

pandasで理解する、平均値と中央値の違い

まずは適当な表をDataFrameを作成します。

import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.reshape(np.random.randint(1,50,9), [3, 3]))
df
45 48 1
4 4 40
10 20 22

平均値の計算

用意したDataFrameに対して、列の平均をとると、以下のようの結果になります。

df.mean()
0    19.666667
1    24.000000
2    21.000000

この結果は以下の計算式と一致します。

df.sum()/df.count()

平均の定義である、合計÷個数です。

中央値の計算

用意したDataFrameに対して、列の平均をとると、以下のようの結果になります。

df.median()
0    10.0
1    20.0
2    22.0

これは以下の計算式と一致します。(行数が奇数の場合に限る)

center_row_index = int((len(df.index)-1)/2)
for i in range(len(df.index)):
    print(df[[i]].sort_values(i).iloc[center_row_index])

各列の値をソートし、その中央に来る値を取得すると、中央値となります。

DataFrame.median()は、もし行数が偶数の場合、中央にもっとも近い2つの数の平均値を取得します。

おまけ

meanについて

公式ドキュメント

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mean.html

docstring

Return the mean of the values for the requested axis

Parameters
----------
axis : {index (0), columns (1)}
skipna : boolean, default True
    Exclude NA/null values when computing the result.
level : int or level name, default None
    If the axis is a MultiIndex (hierarchical), count along a
    particular level, collapsing into a Series
numeric_only : boolean, default None
    Include only float, int, boolean columns. If None, will attempt to use
    everything, then use only numeric data. Not implemented for Series.

Returns
-------
mean : Series or DataFrame (if level specified)

Source

https://github.com/pandas-dev/pandas/blob/v0.25.0/pandas/core/generic.py#L11596-L11621

    @Substitution(
        desc=desc,
        name1=name1,
        name2=name2,
        axis_descr=axis_descr,
        min_count="",
        see_also=see_also,
        examples=examples,
    )
    @Appender(_num_doc)
    def stat_func(
        self, axis=None, skipna=None, level=None, numeric_only=None, **kwargs
    ):
        if name == "median":
            nv.validate_median(tuple(), kwargs)
        else:
            nv.validate_stat_func(tuple(), kwargs, fname=name)
        if skipna is None:
            skipna = True
        if axis is None:
            axis = self._stat_axis_number
        if level is not None:
            return self._agg_by_level(name, axis=axis, level=level, skipna=skipna)
        return self._reduce(
            f, name, axis=axis, skipna=skipna, numeric_only=numeric_only
        )

medianについて

公式ドキュメント

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.median.html

docstring

Return the median of the values for the requested axis

Parameters
----------
axis : {index (0), columns (1)}
skipna : boolean, default True
    Exclude NA/null values when computing the result.
level : int or level name, default None
    If the axis is a MultiIndex (hierarchical), count along a
    particular level, collapsing into a Series
numeric_only : boolean, default None
    Include only float, int, boolean columns. If None, will attempt to use
    everything, then use only numeric data. Not implemented for Series.

Returns
-------
median : Series or DataFrame (if level specified)

Source

https://github.com/pandas-dev/pandas/blob/v0.25.0/pandas/core/generic.py#L11596-L11621

    @Substitution(
        desc=desc,
        name1=name1,
        name2=name2,
        axis_descr=axis_descr,
        min_count="",
        see_also=see_also,
        examples=examples,
    )
    @Appender(_num_doc)
    def stat_func(
        self, axis=None, skipna=None, level=None, numeric_only=None, **kwargs
    ):
        if name == "median":
            nv.validate_median(tuple(), kwargs)
        else:
            nv.validate_stat_func(tuple(), kwargs, fname=name)
        if skipna is None:
            skipna = True
        if axis is None:
            axis = self._stat_axis_number
        if level is not None:
            return self._agg_by_level(name, axis=axis, level=level, skipna=skipna)
        return self._reduce(
            f, name, axis=axis, skipna=skipna, numeric_only=numeric_only
        )

最初に処理する関数は同じですが、if name == “median”で分岐されます。

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki