pandas.Seriesのインデックスと値を入れ替え(スワップ)

pandas.Seriesのインデックス(ラベル)と値を入れ替える(スワップする)方法を説明します。 以下のpandas.Seriesを例とします。timeitモジュールは処理速度計測のためにインポートしています。

import pandas as pd
import timeit

s = pd.Series(['a', 'b', 'c', 'd', 'e'])

print(s)
# 0    a
# 1    b
# 2    c
# 3    d
# 4    e
# dtype: object

以下の内容について説明します。

コンストラクタにインデックスと値を入れ替えて指定 values属性を使う場合と使わない場合の速度比較

コンストラクタにインデックスと値を入れ替えて指定

pandas.Seriesにインデックスと値を入れ替えるメソッドはないので、コンストラクタpandas.Series()の第一引数dataと第二引数indexにそれぞれ元のpandas.Seriesのインデックスと値を指定して新たなpandas.Seriesを生成します。

s_swap = pd.Series(s.index.values, s.values)

print(s_swap)
# a    0
# b    1
# c    2
# d    3
# e    4
# dtype: int64

ここではpandas.Seriesおよびそのindexのvalues属性(NumPy配列numpy.ndarray)を使っている。

print(s.values)
# ['a' 'b' 'c' 'd' 'e']

print(type(s.values))
# <class 'numpy.ndarray'>

print(s.index.values)
# [0 1 2 3 4]

print(type(s.index.values))
# <class 'numpy.ndarray'>

values属性を使わずにそのまま指定しても同じ結果が得られるが、values属性を使ったほうが多少速い(後述)。

s_swap = pd.Series(s.index, s)

print(s_swap)
# a    0
# b    1
# c    2
# d    3
# e    4
# dtype: int64

values属性を使う場合と使わない場合の速度比較

values属性を使う場合と使わない場合の速度をtimeitモジュールを使って比較します。

以下のようにvalues属性を使ったほうが速い。

loop = 10000

result = timeit.timeit(lambda: pd.Series(s.index.values, s.values), number=loop)
print(result / loop)
# 8.694580160081386e-05

result = timeit.timeit(lambda: pd.Series(s.index, s), number=loop)
print(result / loop)
# 0.00010916587258689105

元のpandas.Seriesのサイズが大きくても同じ。

s_large = pd.concat([s] * 100000)

print(len(s_large))
# 500000

loop = 100

result = timeit.timeit(lambda: pd.Series(s_large.index.values, s_large.values), number=loop)
print(result / loop)
# 0.005923357829451561

result = timeit.timeit(lambda: pd.Series(s_large.index, s_large), number=loop)
print(result / loop)
# 0.006492725329007953

とはいえ、よっぽど巨大なpandas.Seriesでない限りそんなに時間がかかるわけでもないので、values属性を使っても使わなくてもどっちでもいいかもしれない。

シェア

関連カテゴリー

Python pandas

pandasのcrosstabでクロス集計(カテゴリ毎の出現回数・頻度を算出) pandas.DataFrameの列をインデックス(行名)に割り当てるset_index pandasの表示設定変更(小数点以下桁数、有効数字、最大行数・列数など) pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出 pandas.DataFrame, SeriesとNumPy配列ndarrayを相互に変換 pandas.DataFrameから条件を満たす行名・列名の行・列を抽出(選択) pandasでcsv/tsvファイル読み込み(read_csv, read_table) pandas参考書『Python for Data Analysis, 2nd Edition』 pandasのplotメソッドでグラフを作成しデータを可視化 pandasで数値を丸める(四捨五入、偶数への丸め) pandasで複数条件のand, or, notから行を抽出(選択) pandas.DataFrameの行を条件で抽出するquery pandas.DataFrame, Seriesのインデックスを振り直すreset_index pandas.DataFrame, Seriesの行をランダムソート(シャッフル) pandas.DataFrameをGroupByでグルーピングし統計量を算出

Last Updated: 6/26/2019, 10:34:03 PM