HOWTO · Pandas

Pandas Series를 DataFrame으로 변환하는 방법

Pandas Series를 DataFrame으로 변환하는 방법을 소개합니다.

이 페이지의 내용

pandas.DataFrame()이나 pandas.Series.to_frame()을 사용하면 하나의 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()에 전달하면 열이 하나인 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인 열 하나를 가지며, a부터 j까지의 레이블을 인덱스로 유지합니다.

입력이 이미 Series이고 생성 시점에 DataFrame 옵션을 지정하고 싶을 때 이 생성자를 사용합니다. columns 목록은 출력 열의 레이블을 제어하며, Series 인덱스를 대체하지는 않습니다. columns를 생략하면 pandas는 Series에 이름이 설정되어 있을 경우 그 이름을 값 열에 사용하고, 그렇지 않으면 0을 사용합니다.

pandas.Series.to_frame()을 사용해 하나의 Pandas Series를 DataFrame으로 변환하기

Series를 직접 열이 하나인 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를 하나의 DataFrame에 나란히 배치하려면 axis=1과 함께 pd.concat()에 전달합니다. Pandas는 인덱스 레이블을 기준으로 값을 정렬하므로, 일치하는 레이블은 같은 행에 들어갑니다. 아래 Series들은 동일한 인덱스를 가지며 세 개의 값 열을 생성합니다.

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에 없는 레이블은 해당 열에서 결측값이 됩니다.