표 형식의 데이터를 처리할 때 엑셀과 같은 스프레드시트 프로그램을 사용합니다. 파이썬에서 데이터 테이블을 로드하고 조작, 정렬, 병합 및 시각화 작업 등을 할 때에는 판다스( Pandas)를 사용하면 편리합니다. Pandas는 파이썬에서 데이터 테이블을 처리하도록 해 주는 오픈 소스 라이브러리입니다.
※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.
- 원문: How to use Pandas for data analysis in Python
- URL: https://www.reseller.co.nz/article/709623/how-use-pandas-data-analysis-python/
Pandas 사용하기
Pandas를 사용하려면 먼저 라이브러리를 가져옵니다. 코드 입력을 쉽게하기 위해 Pandas 라이브러리에 별칭을 지정하는 것이 일반적인 관행입니다.
import pandas as pd
CSV 형식의 샘플 데이터 작업을 시작하려면 pd.read_csv 함수를 사용하여 데이터 프레임으로 로드할 수 있습니다.
df = pd.read_csv("./gapminder/inst/extdata/gapminder.tsv", sep='\t')
sep 매개 변수를 사용하면 이 특정 파일이 쉼표 로 구분되지 않고 탭으로 구분되도록 지정할 수 있습니다.
데이터가 로드되면 데이터 프레임의 .head() 메서드를 사용하여 형식을 엿보고 올바르게 로드되었는지 확인할 수 있습니다.
print(df.head())
country continent year lifeExp pop gdpPercap
0 Afghanistan Asia 1952 28.801 8425333 779.445314
1 Afghanistan Asia 1957 30.332 9240934 820.853030
2 Afghanistan Asia 1962 31.997 10267083 853.100710
3 Afghanistan Asia 1967 34.020 11537966 836.197138
4 Afghanistan Asia 1972 36.088 13079460 739.981106
데이터프레임 개체에는 데이터프레임의 행과 열 수를 레포팅하는 shape 속성이 있습니다.
print(df.shape)
(1704, 6) # rows, cols
열 자체의 이름을 나열하려면 columns를 사용합니다.
print(df.columns)
Index(['country', 'continent', 'year', 'lifeExp',
'pop', 'gdpPercap'], dtype='object')
Pandas의 데이터프레임은 Julia 및 R 과 같은 다른 언어의 데이터프레임과 거의 동일한 방식으로 작동합니다. 각 열 또는 은 동일한 유형이어야 하지만 각 행은 혼합 유형을 포함할 수 있습니다. 예를 들어, 현재 예에서 country열은 항상 문자열이고 year열은 항상 정수입니다. 각 열의 데이터 유형을 나열하는 .dtypes 방법을 사용하여 이를 확인할 수 있습니다.
print(df.dtypes)
country object
continent object
year int64
lifeExp float64
pop int64
gdpPercap float64
dtype: object
데이터프레임 유형을 더욱 명확하게 분석하려면 .info()를 사용할 수 있습니다.
df.info() # information is written to console, so no print required
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 country 1704 non-null object
1 continent 1704 non-null object
2 year 1704 non-null int64
3 lifeExp 1704 non-null float64
4 pop 1704 non-null int64
5 gdpPercap 1704 non-null float64
dtypes: float64(2), int64(2), object(2)
memory usage: 80.0+ KB
Pandas 열 추출
Pandas 데이터프레임의 열을 검사하려면 이름, 위치 또는 범위별로 추출할 수 있습니다. 예를 들어 데이터에서 특정 열을 원하는 경우 대괄호를 사용하여 이름으로 요청할 수 있습니다.
# extract the column "country" into its own dataframe
country_df = df["country"]
# show the first five rows
print(country_df.head())
| 0 Afghanistan
| 1 Afghanistan
| 2 Afghanistan
| 3 Afghanistan
| 4 Afghanistan
Name: country, dtype: object</p>
<p># show the last five rows
print(country_df.tail())
| 1699 Zimbabwe
| 1700 Zimbabwe
| 1701 Zimbabwe
| 1702 Zimbabwe
| 1703 Zimbabwe
| Name: country, dtype: object
여러 열을 추출하려면 열 이름 목록을 전달합니다.
# Looking at country, continent, and year
subset = df</p>
<p>print(subset.head())</p>
<p>country continent year
| 0 Afghanistan Asia 1952
| 1 Afghanistan Asia 1957
| 2 Afghanistan Asia 1962
| 3 Afghanistan Asia 1967
| 4 Afghanistan Asia 1972
print(subset.tail())</p>
<p>country continent year
| 1699 Zimbabwe Africa 1987
| 1700 Zimbabwe Africa 1992
| 1701 Zimbabwe Africa 1997
| 1702 Zimbabwe Africa 2002
| 1703 Zimbabwe Africa 2007
Subsetting Rows
데이터프레임에서 행을 추출하려면 두 가지 방법 중 하나를 사용할 수 있습니다.
.iloc[]은 가장 간단한 메서드입니다. 0부터 시작하여 위치를 기준으로 행을 추출합니다. 위의 데이터 프레임 예제에서 첫 번째 행을 가져오려면 df.iloc[0]를 사용합니다.
일정 범위의 행을 가져오려면 Python의 .iloc[] 슬라이싱 구문을 사용할 수 있습니다. 예를 들어 처음 10개 행에 df.iloc[0:10]을 사용합니다. 그리고 마지막 10개 행을 역순으로 얻으려면 df.iloc[::-1]을 사용합니다.
행을 추출하는 또 다른 방법은 .loc[] 니다. 행의 레이블을 기반으로 하위 집합을 추출합니다. 기본적으로 행에는 0부터 시작하는 증분 정수 값으로 레이블이 지정됩니다. 그러나 데이터 프레임의 .index 속성을 설정하여 데이터에 수동으로 레이블을 지정할 수도 있습니다. 예를 들어, 각 행이 100의 배수를 사용하는 인덱스를 갖도록 위의 데이터프레임을 다시 인덱싱하려면 df.index = range(0, len(df)*100, 100)을 사용할 수 있습니다. 그런 다음 df.loc[100] 을 사용하면 두 번째 행을 얻게 됩니다.
Subsetting Columns
행 조각과 함께 특정 열 하위 집합만 검색하려면 열 목록을 두 번째 인수로 전달하면 됩니다.
df.loc
예를 들어, 위의 데이터세트를 사용하여 모든 행에 대해 국가 및 연도 열만 가져오려면 다음을 수행합니다.
df.loc[:, ["country","year"]]
첫 번째 위치의 :는 '모든 행'을 의미합니다(파이썬의 슬라이싱 구문). 열 목록은 쉼표 뒤에 나옵니다. .iloc을 사용할 때 위치별로 열을 지정할 수도 있습니다.
df.iloc[:, [0,2]]
또는 처음 세 개의 열만 얻으려면 다음을 수행합니다.
df.iloc[:, 0:3]
다음은 Pandas에게 숫자 레이블로 처음 100개 행을 추출한 다음, 그로부터 인덱스 로 처음 3개 열을 추출하도록 지시합니다.
df.loc[0:100].iloc[:, 0:3]
일반적으로 데이터를 하위 집합으로 분류할 때 실제 열 이름을 사용하는 것이 가장 혼란스럽습니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있으며 어떤 열이 어떤 인덱스에 해당하는지 파악하기 위해 데이터세트를 다시 참조할 필요가 없습니다. 또한 열의 순서가 변경되는 경우 실수를 방지할 수 있습니다.
그룹화 및 집계된 계산
스프레드시트와 숫자 계산 라이브러리에는 모두 데이터에 대한 통계를 생성하는 방법이 함께 제공됩니다. Gapminder 데이터를 다시 고려해보세요.
print(df.head(n=10))
| country continent year lifeExp pop gdpPercap
| 0 Afghanistan Asia 1952 28.801 8425333 779.445314
| 1 Afghanistan Asia 1957 30.332 9240934 820.853030
| 2 Afghanistan Asia 1962 31.997 10267083 853.100710
| 3 Afghanistan Asia 1967 34.020 11537966 836.197138
| 4 Afghanistan Asia 1972 36.088 13079460 739.981106
| 5 Afghanistan Asia 1977 38.438 14880372 786.113360
| 6 Afghanistan Asia 1982 39.854 12881816 978.011439
| 7 Afghanistan Asia 1987 40.822 13867957 852.395945
| 8 Afghanistan Asia 1992 41.674 16317921 649.341395
| 9 Afghanistan Asia 1997 41.763 22227415 635.341351
다음은 이 데이터에 관해 질문할 수 있는 몇 가지 질문의 예입니다.
- 이 데이터에 있는 각 연도의 평균 기대 수명은 얼마입니까?
- 연도와 대륙에 걸친 평균을 원하면 어떻게 됩니까?
- 이 데이터에 있는 각 대륙의 국가 수는 어떻게 계산합니까?
Pandas를 사용하여 이러한 질문에 대답하는 방법은 그룹화 또는 집계 계산을 수행하는 것입니다. 특정 선을 따라 데이터를 분할하고 각 분할 세그먼트에 일부 계산을 적용한 다음 결과를 새로운 데이터 프레임으로 다시 결합할 수 있습니다.
그룹화된 평균 갯수
이를 위해 사용할 첫 번째 방법은 Pandas의 df.groupby()입니다.
df.groupby("year")
동일한 연도 값을 가진 모든 행을 데이터프레임 자체와 별개의 개체로 처리할 수 있습니다. '기대 수명' 열을 사용하여 연간 평균을 계산할 수 있습니다.
print(df.groupby('year')['lifeExp'].mean())
year
1952 49.057620
1957 51.507401
1962 53.609249
1967 55.678290
1972 57.647386
1977 59.570157
1982 61.533197
1987 63.212613
1992 64.160338
1997 65.014676
2002 65.694923
2007 67.007423
모든 인구의 연도별 평균 기대 수명을 알 수 있습니다. 연도별 인구와 GDP에 대해 동일한 종류의 계산을 수행할 수 있습니다.
print(df.groupby('year')['pop'].mean())
print(df.groupby('year')['gdpPercap'].mean())
데이터를 두 개 이상의 열로 그룹화하려면 어떻게 해야 할까요? 목록에 열을 전달하여 이를 수행할 수 있습니다.
print(df.groupby(['year', 'continent'])
.mean())
lifeExp gdpPercap
year continent
1952 Africa 39.135500 1252.572466
Americas 53.279840 4079.062552
Asia 46.314394 5195.484004
Europe 64.408500 5661.057435
Oceania 69.255000 10298.085650
1957 Africa 41.266346 1385.236062
Americas 55.960280 4616.043733
Asia 49.318544 5787.732940
Europe 66.703067 6963.012816
Oceania 70.295000 11598.522455
1962 Africa 43.319442 1598.078825
Americas 58.398760 4901.541870
Asia 51.563223 5729.369625
Europe 68.539233 8365.486814
Oceania 71.085000 12696.452430
결과를 단일 증분 인덱스 프레임으로 "평탄화"하려는 경우, 결과에 대해 .reset_index() 메서드를 사용할 수 있습니다.
gb = df.groupby(['year', 'continent'])
.mean()
flat = gb.reset_index()
print(flat.head())
| year continent lifeExp gdpPercap
| 0 1952 Africa 39.135500 1252.572466
| 1 1952 Americas 53.279840 4079.062552
| 2 1952 Asia 46.314394 5195.484004
| 3 1952 Europe 64.408500 5661.057435
| 4 1952 Oceana 69.255000 10298.085650
그룹화된 빈도수
우리가 데이터로 자주 하는 또 다른 일은 빈도 계산입니다. nunique 및 value_counts 메서드를 사용하여 계열의 고유한 값과 해당 빈도를 얻을 수 있습니다. 예를 들어, 각 대륙에 몇 개의 국가가 있는지 확인하는 방법은 다음과 같습니다.
print(df.groupby('continent')['country'].nunique())
continent
Africa 52
Americas 25
Asia 33
Europe 30
Oceana 2
Pandas 및 Matplotlib를 사용한 기본 플로팅
대부분의 경우 데이터를 시각화하려는 경우 Matplotlib와 같은 다른 라이브러리를 사용하여 해당 그래픽을 생성합니다. Pandas용 간단한 Matplotlib 확장을 사용하려면 먼저 Matplotlib를 인스톨해야 합니다.
pip install matplotlib
이제 세계 인구의 연간 기대 수명을 다시 살펴보겠습니다.
global_yearly_life_expectancy = df.groupby('year')['lifeExp'].mean()
print(global_yearly_life_expectancy)
| year
| 1952 49.057620
| 1957 51.507401
| 1962 53.609249
| 1967 55.678290
| 1972 57.647386
| 1977 59.570157
| 1982 61.533197
| 1987 63.212613
| 1992 64.160338
| 1997 65.014676
| 2002 65.694923
| 2007 67.007423
| Name: lifeExp, dtype: float64
이것으로부터 기본 플롯을 생성하려면 다음 코드를 사용합니다.
import matplotlib.pyplot as plt
global_yearly_life_expectancy = df.groupby('year')['lifeExp'].mean()
c = global_yearly_life_expectancy.plot().get_figure()
plt.savefig("output.png")
결론
Python과 Pandas는 스프레드시트만으로는 얻을 수 없는 많은 기능을 제공합니다. 우선, 데이터 작업을 자동화하고 결과를 재현 가능하게 만들 수 있습니다. 투박하고 제한적인 스프레드시트 매크로를 작성하는 대신 Pandas를 사용하여 데이터를 분석, 분할 및 변환하고 Python의 표현력 및 패키지 생태계(예: 데이터를 그래프로 표시하거나 다른 형식으로 렌더링)를 사용하여 더 많은 작업을 수행할 수 있습니다.
'Python' 카테고리의 다른 글
개발자 가이드: Python을 사용하여 암호화폐 지갑을 구축하는 방법 (56) | 2023.12.07 |
---|---|
모든 프로그래머가 알아야 할 10가지 기본 프로그래밍 원칙 (2) | 2023.12.03 |
Python If-Else 문을 사용하는 방법 (2) | 2023.12.01 |
Python과 데이터베이스를 사용하여 등록 앱을 만드는 방법 (2) | 2023.11.14 |
데이터 구조와 알고리즘 코딩 과제를 연습할 수 있는 사이트 7개 (0) | 2023.11.13 |