hatunina’s blog

メモと日記です

pd.Seriesに辞書を渡すとキーで昇順にソートされる

Seriesを作る際にindexを指定した場合、指定したindexはリストなので順番を持っています。
なので、リストの順番でSeriesが作られます。

hoge = pd.Series([1, 2, 3, 4, 5], index=['C','A','B','E','D'])
print(hoge)

# 実行結果
C    1
A    2
B    3
E    4
D    5
dtype: int64


これに対し、辞書を渡した場合はどうなるでしょう。

huga = pd.Series({'C': 1, 'A': 2, 'B': 3, 'E': 4, 'D': 5})
print(huga)

# 実行結果
A    2
B    3
C    1
D    5
E    4
dtype: int64


辞書は順番を持たないので、出力はてきと〜になるかと思いきや、渡した辞書のキーで昇順になっています。
うーむ、なんか直感に反するぞ。。。

調査

ということで調査です。
しかし、ドキュメントを読んでみてもそれらしき記述は見つからず。
ググっても検索ワードが思いつかずそれらしき情報も見当たらず。
なので、pyCharmでライブラリをデバッグしてみることに。

すると、Seriesクラスのコンストラクタにこんなコードが!

            elif isinstance(data, dict):
                if index is None:
                    if isinstance(data, OrderedDict):
                        index = Index(data)
                    else:
                        index = Index(_try_sort(data))


ここで、dataというのはSeriesに渡された変数です。
要するに、pd.Series(data)とした時に辞書が渡されているかつindexの指定がない場合は_try_sortとやらを実行するとのこと。
OrderedDictは順番が保持されているのでそれをそのまま使うみたいですね。

で、_try_sortを見ると、、、

def _try_sort(iterable):
    listed = list(iterable)
    try:
        return sorted(listed)
    except Exception:
        return listed


ソートしてる〜
これやんけ〜

ということで、pd.Seriesに辞書を渡すとキーで昇順にソートされる、というお話でした。