HOWTO · Pandas

Pandas Series を DataFrame に変換する方法

Pandas の Series を DataFrame に変換する方法を紹介します。

このページの内容

pandas.DataFrame() または pandas.Series.to_frame() を使うと、1 つの Pandas Series を DataFrame に変換できます。どちらの方法でも、Series のインデックスは DataFrame の行インデックスとして保持されます。値の列に名前を付けるには to_frame(name=...) を使い、古いインデックスを通常の列にしたい場合は reset_index(name=...) を使います。複数の Series を列として組み合わせるには、pd.concat(..., axis=1) を使います。

以下の例では、次の Series を使います。そのラベルは、各変換で行インデックスになります。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(df_series)
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64

pandas.DataFrame() を使って単一の Pandas Series を DataFrame に変換する

Series を pandas.DataFrame() に渡すと、1 列の DataFrame が作成されます。columns 引数は値の列のラベルを設定します。Series のインデックスは行インデックスのまま残ります。この汎用コンストラクタは、すでに他のデータから DataFrame を構築している場合に便利です。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(pd.DataFrame(df_series, columns=["A"]))
    A
a  44
b  47
c  64
d  67
e  67
f   9
g  83
h  21
i  36
j  87

結果の DataFrame には A という名前の列が 1 つあり、ラベル a から j がインデックスとして保持されます。

入力がすでに Series で、作成時に DataFrame のオプションを指定したい場合は、このコンストラクタを使います。columns リストは出力列のラベルを制御しますが、Series のインデックスを置き換えるものではありません。columns を省略すると、pandas は Series に名前が設定されていればそれを値の列に使い、そうでなければ 0 を使います。

pandas.Series.to_frame() を使って単一の Pandas Series を DataFrame に変換する

Series を直接 1 列の DataFrame に変えたい場合は、Series.to_frame() を呼び出します。name を渡すと値の列のラベルを選べます。このメソッドは Series のインデックスを保持するため、そのラベルで行を識別する場合に便利です。

単一の Series については、to_frame(name="A") は pandas.DataFrame(series, columns=["A"]) の簡潔な代替です。特にこの DataFrame を他のテーブルと結合する前に、値を表す名前を選んでください。これらの変換は Series のインデックスをデータ列には変えません。そのレイアウトには reset_index() を使います。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

print(df_series.to_frame(name="A"))
    A
a  44
b  47
c  64
d  67
e  67
f   9
g  83
h  21
i  36
j  87

Series に名前がない場合、to_frame() は値の列のラベルとして 0 を使います。Series のインデックスも列のデータとして必要な場合は、reset_index() メソッド を使います。インデックス軸に名前を付けると、最初の出力列が index になります。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
).rename_axis("index")

print(df_series)
print("\n")
print(df_series.reset_index())
index
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64


  index   0
0     a  44
1     b  47
2     c  64
3     d  67
4     e  67
5     f   9
6     g  83
7     h  21
8     i  36
9     j  87

reset_index() は、元のインデックスを index 列に、Series の値を 0 という名前の列に入れた DataFrame を返します。値の列に直接ラベルを付けるには name を指定します。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
).rename_axis("index")

print(df_series)
print("\n")
print(df_series.reset_index(name="A"))
index
a    44
b    47
c    64
d    67
e    67
f     9
g    83
h    21
i    36
j    87
dtype: int64


  index   A
0     a  44
1     b  47
2     c  64
3     d  67
4     e  67
5     f   9
6     g  83
7     h  21
8     i  36
9     j  87

複数の Pandas Series を DataFrame に変換する

複数の Series を 1 つの DataFrame に横並びに配置するには、axis=1 を指定して pd.concat() に渡します。Pandas はインデックスのラベルで値を揃えるため、一致するラベルは同じ行に入ります。以下の Series は同じインデックスを持ち、3 つの値の列を生成します。

import pandas as pd
import numpy as np

np.random.seed(0)

df_series1 = pd.Series(
    np.random.randint(0, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)
df_series2 = pd.Series(
    np.random.randint(40, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)
df_series3 = pd.Series(
    np.random.randint(80, 100, size=(10)),
    index=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"],
)

df_stitched = pd.concat([df_series1, df_series2, df_series3], axis=1)

print(df_stitched)
    0   1   2
a  44  46  97
b  47  64  85
c  64  64  93
d  67  52  88
e  67  98  89
f   9  41  99
g  83  78  96
h  21  79  99
i  36  63  85
j  87  86  95

pd.concat() 関数 は axis=1 を使って列方向に連結します。既定値は axis=0 で、代わりに行方向に連結します。インデックスが異なる場合、列方向の連結はラベルで揃えます。ある Series に存在しないラベルは、その列で欠損値になります。