HOWTO · Pandas

Python Pandas Dataframe에서 목록 길이 결정

Pandas DataFrame의 목록 열에서 각 목록의 길이를 구하려면 Python 내장 함수 len()을 각 목록에 적용합니다. Series.map() 또는 Series.apply()를 사용해 행마다 개수를 구하고, 그 결과를 새 열에 저장할 수 있습니다.

이 페이지의 내용

Python 내장 함수 len()는 DataFrame 열에 저장된 각 목록의 요소 수를 셉니다. 해당 열의 Series에 map() 또는 apply()를 적용하면 행마다 개수를 하나씩 구할 수 있으며, 그 값을 새 열에 할당하면 됩니다. 이 작업은 목록 안의 요소를 세는 것이며 DataFrame의 행이나 열 개수를 세는 것이 아닙니다.

목록 값이 들어 있는 열로 DataFrame 만들기

DataFrame의 셀에는 Python 목록을 저장할 수 있습니다. 예를 들어 Lists 열에 [1, 2, 3], [4, 5], [6]이 들어갈 수 있습니다. 각 행에는 해당 행만의 목록이 저장되므로, 행별 개수는 그 행의 값에 따라 달라집니다. 아래 예제에서는 열 이름으로 Lists, 결과 열 이름으로 Length를 사용합니다. DataFrame에 맞게 두 이름을 바꾸면 됩니다.

Series.map(len)으로 목록 길이 계산하기

목록 값이 들어 있는 열에서 선택한 Series에 map(len)을 호출한 다음, 반환된 Series를 DataFrame에 할당합니다. map()는 전달된 함수를 각 값에 적용하므로, 결과에는 각 행 인덱스에 대응하는 개수가 하나씩 들어갑니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import pandas as pd

df = pd.DataFrame({"Lists": [[1, 2, 3], [4, 5], [6], [7, 8, 9, 10]]})
df["Length"] = df["Lists"].map(len)
print(df)
           Lists  Length
0      [1, 2, 3]       3
1         [4, 5]       2
2            [6]       1
3  [7, 8, 9, 10]       4

Length의 값은 각 목록의 요소 개수인 3, 2, 1, 4에 해당합니다. 이 작업을 다른 DataFrame에 적용하려면 Lists 대신 목록 값이 들어 있는 열을 선택하고, Length 대신 원하는 결과 열 이름을 지정하세요. 할당할 때 매핑된 값은 해당 Series의 인덱스에 맞춰 정렬됩니다.

대안으로 Series.apply(len) 사용하기

같은 Series 작업에서 apply()를 사용해 각 목록에 내장 함수를 적용할 수도 있습니다. 앞 예제의 DataFrame을 사용하면 df["Length"] = df["Lists"].apply(len)과 같이 할당할 수 있습니다. 이 목록 값에서는 같은 개수가 나옵니다. 주변 코드에 더 잘 맞는 형식을 선택하세요. 여기서는 어느 쪽이 더 빠르다고 주장하지 않습니다. Series.map()는 Series의 각 값에 함수를 적용하는 작업이며, apply()는 축을 기준으로 DataFrame에도 사용할 수 있으므로 어떤 객체에 호출하는지 유의하세요.

빈 값과 목록이 아닌 값 처리하기

빈 목록의 길이는 0이므로 len([])은 0을 반환합니다. 이 값도 같은 매핑 작업에 입력할 수 있습니다. 하지만 열에 None, NaN 또는 정수 같은 스칼라 값이 함께 있으면 len()를 모든 값에 무조건 적용할 수 없습니다. 이런 값에는 목록의 길이가 없으므로 직접 호출하면 TypeError가 발생할 수 있습니다. 개수를 세기 전에 이런 값을 어떻게 처리할지 정하세요.

목록이 아닌 모든 값을 0으로 세려면 df["Lists"].map(lambda value: len(value) if isinstance(value, list) else 0)을 사용하세요. 람다는 각 목록의 길이를 반환하고 목록이 아닌 모든 값에는 0을 지정합니다. 목록이 아닌 값을 빈 목록으로 변환하지는 않습니다. 모든 비목록 입력에 0을 부여하는 것이 의도한 규칙일 때만 이 방식을 사용하세요. 튜플이나 문자열 같은 다른 이터러블도 허용한다면 허용할 타입을 명시하고 확인하세요. len()는 그런 값의 요소나 문자 수도 셉니다. 입력 처리 규칙을 Length 열의 의미와 일치시키세요.