Pandas 기초

밤비나·2023년 4월 2일
0

EDA

목록 보기
1/7

https://pandas.pydata.org/docs/reference/frame.html

DataFrame의 구조


pandas는 파이썬에서 데이터를 처리하기 위한 라이브러리 중 하나로, 데이터를 다루기 위한 강력한 도구인 DataFrame을 제공한다. DataFrame은 표 형태의 데이터를 다루는 자료구조로, 행과 열을 가지며 각각의 열은 다양한 데이터 타입을 포함할 수 있다.

주로 쓰이는 함수

명령어설명
pd.DataFrame(data)DataFrame을 생성. data는 DataFrame을 생성하기 위한 데이터이며, 리스트, 딕셔너리, Numpy 배열 등 다양한 형태가 가능
df.head(n)DataFrame의 상위 n개의 행을 출력. 기본값은 n=5
df.tail(n)DataFrame의 하위 n개의 행을 출력. 기본값은 n=5
df.shapeDataFrame의 행과 열의 수를 출력.
df.columnsDataFrame의 열 이름을 출력.
df.indexDataFrame의 행 인덱스를 출력.
df.info()DataFrame의 정보를 출력. 각 열의 데이터 타입과 누락된 값의 개수 등을 보여줌.
df.describe()DataFrame의 요약 통계 정보를 출력. 각 열의 개수, 평균, 표준편차, 최소값, 25%, 50%, 75%, 최대값 등을 보여줌.
df.sort_values()DataFrame을 지정한 열을 기준으로 정렬.
df.groupby()DataFrame을 지정한 열을 기준으로 그룹화.
df.merge()두 개의 DataFrame을 병합.
df.dropna()DataFrame에서 누락된 값을 가지는 행을 삭제.
df.fillna()DataFrame에서 누락된 값을 지정한 값으로 채움.

판다스 모듈 임포트 하기

import pandas as pd

Pandas에서 엑셀 및 텍스트 파일 읽기

  • 한글은 encoding 설정이 필수!
data = pd.read_csv('./data/01.data.csv', encoding='utf-8')
  • 컬럼 이름 조회
data.columns
data.columns[0] # 인덱스로 특정 컬럼 이름 조회
  • 컬럼 이름 변경
data.rename(coulumns={data.columns[0]:'변경할 이름'}, inplace=True)
data.head()
  • 엑셀 파일 열기
excel_data = pd.read_excel('./data/01.excel.xls')
  • 엑셀 설정
    • 자료를 읽기 시작할 행(header) 지정
    • 읽어올 엑셀의 컬럼을 지정(usecols)
excel_data = pd.read_excel(('./data/01.excel.xls'), header=2, usecols='B,D,G,J,N')

excel_data.rename(
coulumns={
	data.columns[0]:'변경할 이름1',
	data.columns[1]:'변경할 이름2',
	data.columns[2]:'변경할 이름3'
},
	inplace=True,
)
  • Pandas의 데이터형을 구성하는 기본은 Series이다.
s = pd.Series([1,3,5,np.nan,6,8]

Series

  • index와 value로 이루어져 있다.
  • 한 가지 데이터 타입만 가질 수 있다.
pd.Series([1,2,3,4], dtype=np.float64)
0    1.0
1    2.0
2    3.0
3    4.0
dtype: float64
pd.Series([1,2,3,4], dtype=str)
0    1
1    2
2    3
3    4
dtype: object
pd.Series(np.array([1,2,3]))
0    1
1    2
2    3
dtype: int32
pd.Series({'key':'value'})
key    value
dtype: object
data = pd.Series([1,2,'4',6])
data
0    1
1    2
2    4
3    6
dtype: object
data = pd.Series([1,2,3,4,5,6])
data % 2
0    1
1    0
2    1
3    0
4    1
5    0
dtype: int64

날짜 데이터

dates = pd.date_range('2023-03-27', periods=6)

DataFrame

  • pd.Series()
    • index, value
  • pd.DataFrame()
    • index, value, column
# 표준정규분포에서 샘플링한 난수 생성
data = np.random.randn(6,4)
data
array([[ 1.30525756,  0.73862939,  0.60714642,  1.05939792],
       [ 0.33454717,  0.38086935,  0.43812032,  0.16190495],
       [-1.08102524,  0.30435644, -1.02498264, -1.67737907],
       [ 2.10420039,  1.08870891, -1.29674975,  0.65929457],
       [-0.15597073,  0.98285898,  0.45967896, -1.03715274],
       [-1.44675823,  0.70153244, -0.86002622,  0.15041849]])
df = pd.DataFrame(data, index=dates, columns=["A","B","C","D"])
df
A B C D
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-04-01 -1.446758 0.701532 -0.860026 0.150418

데이터 프레임 정보 탐색

df.head()
A B C D
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
df.tail()
A B C D
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
df.index
DatetimeIndex(['2023-03-27', '2023-03-28', '2023-03-29', '2023-03-30',
               '2023-03-31', '2023-04-01'],
              dtype='datetime64[ns]', freq='D')
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
df.values
array([[ 1.30525756,  0.73862939,  0.60714642,  1.05939792],
       [ 0.33454717,  0.38086935,  0.43812032,  0.16190495],
       [-1.08102524,  0.30435644, -1.02498264, -1.67737907],
       [ 2.10420039,  1.08870891, -1.29674975,  0.65929457],
       [-0.15597073,  0.98285898,  0.45967896, -1.03715274],
       [-1.44675823,  0.70153244, -0.86002622,  0.15041849]])
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 6 entries, 2023-03-27 to 2023-04-01
Freq: D
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   A       6 non-null      float64
 1   B       6 non-null      float64
 2   C       6 non-null      float64
 3   D       6 non-null      float64
dtypes: float64(4)
memory usage: 240.0 bytes
df.describe()
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.176708 0.699493 -0.279469 -0.113919
std 1.366892 0.313361 0.868914 1.040889
min -1.446758 0.304356 -1.296750 -1.677379
25% -0.849762 0.461035 -0.983744 -0.740260
50% 0.089288 0.720081 -0.210953 0.156162
75% 1.062580 0.921802 0.454289 0.534947
max 2.104200 1.088709 0.607146 1.059398

데이터 정렬

  • sort_values()
  • 특정 컬럼(열)을 기준으로 데이터를 정렬한다.
  • 기본은 오름차순, ascending=False 내림차순
df.sort_values(by='A')
A B C D
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-30 2.104200 1.088709 -1.296750 0.659295
df.sort_values(by='B', ascending=False, inplace=True)
df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379

데이터 선택

# 한 개 컬럼 선택
df['A']
2023-03-30    2.104200
2023-03-31   -0.155971
2023-03-27    1.305258
2023-04-01   -1.446758
2023-03-28    0.334547
2023-03-29   -1.081025
Name: A, dtype: float64
type(df['A'])
pandas.core.series.Series
# 컬럼 이름이 숫자가 아니면 .컬럼 이름으로도 선택할 수 있다.
df.A
2023-03-30    2.104200
2023-03-31   -0.155971
2023-03-27    1.305258
2023-04-01   -1.446758
2023-03-28    0.334547
2023-03-29   -1.081025
Name: A, dtype: float64
# 두 개 이상 컬럼 선택
df[['A','B']]
A B
2023-03-30 2.104200 1.088709
2023-03-31 -0.155971 0.982859
2023-03-27 1.305258 0.738629
2023-04-01 -1.446758 0.701532
2023-03-28 0.334547 0.380869
2023-03-29 -1.081025 0.304356

offset index

  • [n:m] : n부터 m-1 까지
  • 인덱스나 컬럼의 이름으로 slice 하는 경우는 끝을 포함한다.
df[0:3]
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
df['20230327':'20230329']
A B C D
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
  • loc : location
  • index 이름으로 특정 행, 열을 선택한다.
df.loc[:,['A','B']] # 인덱스는 전부 가져오고, A,B 컬럼만 가져와라
A B
2023-03-30 2.104200 1.088709
2023-03-31 -0.155971 0.982859
2023-03-27 1.305258 0.738629
2023-04-01 -1.446758 0.701532
2023-03-28 0.334547 0.380869
2023-03-29 -1.081025 0.304356
df.loc['20230327':'20230329',['A','D']]
A D
2023-03-27 1.305258 1.059398
2023-03-28 0.334547 0.161905
2023-03-29 -1.081025 -1.677379
df.loc['20230330':'20230401','B':'D']
B C D
2023-03-30 1.088709 -1.296750 0.659295
2023-03-31 0.982859 0.459679 -1.037153
2023-04-01 0.701532 -0.860026 0.150418
df.loc['20230328',['A','B']]
A    0.334547
B    0.380869
Name: 2023-03-28 00:00:00, dtype: float64
  • iloc : inter location
    • 컴퓨터가 인식하는 인덱스 값으로 선택
df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
df.iloc[3] # 2023-04-01의 행 값
A   -1.446758
B    0.701532
C   -0.860026
D    0.150418
Name: 2023-04-01 00:00:00, dtype: float64
df.iloc[3,2] # 2023-04-01 C컬럼의 값
-0.8600262185096724
df.iloc[3:5, 0:2]
A B
2023-04-01 -1.446758 0.701532
2023-03-28 0.334547 0.380869
df.iloc[[1,2,4], [0,2]]
A C
2023-03-31 -0.155971 0.459679
2023-03-27 1.305258 0.607146
2023-03-28 0.334547 0.438120
df.iloc[:,1:3]
B C
2023-03-30 1.088709 -1.296750
2023-03-31 0.982859 0.459679
2023-03-27 0.738629 0.607146
2023-04-01 0.701532 -0.860026
2023-03-28 0.380869 0.438120
2023-03-29 0.304356 -1.024983

condition

df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
# A 컬럼에서 0보다 큰 숫자(양수)만 선택
df['A'] > 0
2023-03-30     True
2023-03-31    False
2023-03-27     True
2023-04-01    False
2023-03-28     True
2023-03-29    False
Name: A, dtype: bool
df[df['A'] > 0]
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-28 0.334547 0.380869 0.438120 0.161905
df[df > 0]
A B C D
2023-03-30 2.104200 1.088709 NaN 0.659295
2023-03-31 NaN 0.982859 0.459679 NaN
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 NaN 0.701532 NaN 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 NaN 0.304356 NaN NaN
  • NaN = Not a Number

컬럼 추가

  • 기존 컬럼이 없으면 추가
  • 기존 컬럼이 있으면 값 수정
df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
df['E'] = ['one','one','two','three','four','five']
df
A B C D E
2023-03-30 2.104200 1.088709 -1.296750 0.659295 one
2023-03-31 -0.155971 0.982859 0.459679 -1.037153 one
2023-03-27 1.305258 0.738629 0.607146 1.059398 two
2023-04-01 -1.446758 0.701532 -0.860026 0.150418 three
2023-03-28 0.334547 0.380869 0.438120 0.161905 four
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379 five
  • isin() 특정 요소가 있는지 확인
df['E'].isin(['two'])
2023-03-30    False
2023-03-31    False
2023-03-27     True
2023-04-01    False
2023-03-28    False
2023-03-29    False
Name: E, dtype: bool
df['E'].isin(['two','five'])
2023-03-30    False
2023-03-31    False
2023-03-27     True
2023-04-01    False
2023-03-28    False
2023-03-29     True
Name: E, dtype: bool
df[df['E'].isin(['two','five'])]
A B C D E
2023-03-27 1.305258 0.738629 0.607146 1.059398 two
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379 five

특정 컬럼 제거

  • del
  • drop
del df['E']
df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
df.drop(['D'], axis=1) # axis = 0 가로, axis = 1 세로
A B C
2023-03-30 2.104200 1.088709 -1.296750
2023-03-31 -0.155971 0.982859 0.459679
2023-03-27 1.305258 0.738629 0.607146
2023-04-01 -1.446758 0.701532 -0.860026
2023-03-28 0.334547 0.380869 0.438120
2023-03-29 -1.081025 0.304356 -1.024983
df.drop(['20230401'])
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379

apply()

df
A B C D
2023-03-30 2.104200 1.088709 -1.296750 0.659295
2023-03-31 -0.155971 0.982859 0.459679 -1.037153
2023-03-27 1.305258 0.738629 0.607146 1.059398
2023-04-01 -1.446758 0.701532 -0.860026 0.150418
2023-03-28 0.334547 0.380869 0.438120 0.161905
2023-03-29 -1.081025 0.304356 -1.024983 -1.677379
df['A'].apply('sum')
1.060250919434379
df['A'].apply('mean')
0.1767084865723965
df['A'].apply('min'), df['A'].apply('max')
(-1.4467582258668867, 2.104200385522421)
df[['A','D']].apply('sum')
A    1.060251
D   -0.683516
dtype: float64
df['A'].apply(np.sum)
2023-03-30    2.104200
2023-03-31   -0.155971
2023-03-27    1.305258
2023-04-01   -1.446758
2023-03-28    0.334547
2023-03-29   -1.081025
Name: A, dtype: float64
df['A'].apply('mean')
0.1767084865723965
def plusminus(num):
    return 'plus' if num > 0 else 'minus'
df['A'].apply(plusminus)
2023-03-30     plus
2023-03-31    minus
2023-03-27     plus
2023-04-01    minus
2023-03-28     plus
2023-03-29    minus
Name: A, dtype: object
df['A'].apply(lambda num:'plus' if num>0 else 'minus')
2023-03-30     plus
2023-03-31    minus
2023-03-27     plus
2023-04-01    minus
2023-03-28     plus
2023-03-29    minus
Name: A, dtype: object

Pivot Table이란?

Pivot table은 데이터를 재구성하여 요약하는 테이블 형태의 데이터이다. 데이터를 행과 열을 바꾸고, 행과 열에 대한 요약 통계량을 표시하여 데이터를 쉽게 이해할 수 있게 한다. Pivot table은 엑셀에서도 유사한 기능으로 제공되고 있다.

Pivot Table 만들기

Pivot table을 만들기 위해서는 pandas의 pivot_table() 함수를 사용한다. 다음은 pivot_table() 함수의 기본적인 사용 방법이다.

import pandas as pd

# 데이터 준비
df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar'],
    'B': ['one', 'one', 'one', 'two', 'two', 'two', 'one', 'two'],
    'C': [1, 2, 3, 4, 5, 6, 7, 8],
    'D': [10, 20, 30, 40, 50, 60, 70, 80]
})

# Pivot table 만들기
table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc='sum')

print(table)

  • df: pivot table을 만들기 위한 데이터프레임
  • values: pivot table에 표시할 값의 열 이름
  • index: pivot table의 행 인덱스로 사용할 열 이름 리스트
  • columns: pivot table의 열 인덱스로 사용할 열 이름 리스트
  • aggfunc: pivot table에서 각 셀에 대한 집계 함수 (기본값은 평균)
import pandas as pd

# 데이터 준비
df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar'],
    'B': ['one', 'one', 'one', 'two', 'two', 'two', 'one', 'two'],
    'C': [1, 2, 3, 4, 5, 6, 7, 8],
    'D': [10, 20, 30, 40, 50, 60, 70, 80]
})

# Pivot table 만들기
table = pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=['mean', 'sum'])

print(table)


Pandas의 pivot table에서 aggfunc 인자는 집계 함수를 지정하는데 사용된다. aggfunc 인자에는 다양한 집계 함수들이 지정될 수 있다. 이 함수들은 각 셀에 대해 어떤 연산을 적용할지 결정한다.

sum: 각 셀의 값들의 합계
mean: 각 셀의 값들의 평균
count: 각 셀에 있는 값의 개수
min: 각 셀의 값들 중 최솟값
max: 각 셀의 값들 중 최댓값

aggfunc 인자에 여러 개의 함수를 리스트 형태로 지정하여 각 셀에 대해 여러 개의 집계 함수를 적용할 수도 있다.

profile
씨앗 데이터 분석가.

0개의 댓글