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 に存在しないラベルは、その列で欠損値になります。