파이썬 활용 - Pandas : DataFrame

조쿨러·2024년 1월 2일

Python

목록 보기
3/12

3. DataFrame

2차원 데이터
Series 자료형을 테이블 형태로 표현

  • DataFrame 생성방법 (리스트를 활용한 생성)
from pandas import Series,DataFrame

data = DataFrame([[1,2],[3,4],[5,6],[7,8]])
data

->
	0	1
0	1	2
1	3	4
2	5	6
3	7	8
  • DataFrame 생성방법 (dict를 활용한 생성)
data = DataFrame.from_dict({'서울':[1,2,3],'부산':[2,3,4],'광주':[3,4,5]})
data

->

	서울	부산	광주
0	1	  2		3
1	2	  3		4
2	3	  4		5
  • DataFrame 생성방법 (index, column 설정)
data = DataFrame([[1,2],[3,4],[5,6],[7,8]],
				index = [1,2,3,4],columns = ['서울','부산'])
data

->
	서울	부산
1	1	  2
2	3	  4
3	5	  6
4	7	  8
  • index, column 변경
data = DataFrame.from_dict({'서울' : [1,2,3],'부산':[2,3,4],'광주':[3,4,5]})
data.index = ['1월','2월','3월']
data.columns = ['서울시','부산시','광주시']
data

->

		서울시		부산시		광주시
1월		1			2			3
2월		2			3			4
3월		3			4			5

-> index 0,1,2를 1월, 2월, 3월로 변경
-> column 서울, 부산, 광주를 서울시, 부산시, 광주시로 변경

  • 데이터 조회 : 컬럼명
data = DataFrame([[1,2],[3,4],[5,6]],
				index = [1,2,3],columns = ['서울','부산'])
data

->

	서울	부산
1	1    2
2	3    4
3	5    6

data['서울'] #데이터프레임['컬럼명']

->

1	1
2	3
3	5
Name : 서울, dtype : int64

data.서울 #데이터프레임.컬럼명

->

1	1
2	3
3	5
Name : 서울, dtype : int64

data[['서울','부산']]

->
	서울	부산
1	1     2
2	3     4
3	5     6
  • column 이름 변경 : rename()
(1)
df = pd.DataFrame({'서울' :[1,2],'부산시':[3,4],'대전시':[5,6]})
df

->

	서울	부산시	대전시
0	1	  3		5
1	2	  4		6

(2)
df.rename(columns = {'서울' : '서울시'})

->

	서울시	부산시	대전시
0	1	   3	5
1	2	   4	6
  • column 제거 : drop()
df = pd.DataFrame({'서울':[1,2],'부산':[3,4],'대전':[5,6]})
df.drop(columns = ['서울','대전'])

->

	부산
0	3
1	4
  • index 초기화 : reset_index()
df = pd.DataFrame([10,20,30], index = ['A','B','C'])
df

->
	0
A	10
B	20
C	30

df.reset_index()

->
	index	0
0	A		10
1	B		20
2	C		30
  • 데이터조회 : 인덱스
data.loc[1] #dataframe.loc[인덱스 이름]

->

서울 	1
부산	2
Name : 1, dtype : int64
data.loc[[1,3]] #dataframe.loc[[인덱스명1, 인덱스명2]]

->
	서울	부산
1	1	  2
3	5	  6
data.iloc[0] #dataframe.iloc[인덱스번호]

->

서울	1
부산	2
Name : 1, dtype : int64
data.iloc[0:2] #dataframe.iloc[시작:끝](시작에서 끝 미만)

->
	서울	부산
1	1	  2
2	3	  4
  • 데이터 조회 : 인덱스, 컬럼 동시사용

(1)

인덱스 1의 부산 컬럼값
data.loc[1,'부산']

-> 2
인덱스 3의 서울 컬럼값
data.loc[3]['서울']

-> 5
인덱스 1,2의 서울 컬럼값
data.loc[[1,2],['서울']]

->
	서울
1	1
2	3

(2)

인덱스 0번의 0번 컬럼값
data.iloc[0,0]

-> 1
인덱스 1번의 1번 컬럼값
data.iloc[1][1]

->4
인덱스 0~1번의 1번컬럼값
data.iloc[0:2,1]

-> 1	2
   2	4
   Name : 부산, dtype : int64
  • 조건으로 열의 값 추출
(1)  서울컬럼의 값이 10보다 큰 데이터 추출

df = pd.DataFrame({'서울':[10,20,30],'부산':[2,3,4],'대전':[5,6,7]})
df[df['서울']>10]

->
	서울	부산	대전
1	20	  3	    6
2	30	  4		7

(2) 서울컬럼의 값이 10인 데이터 추출

df = pd.DataFrame({'서울':[10,20,30],'부산':[2,3,4],'대전':[5,6,7]})
df[df['서울']==10]

->
	서울	부산	대전
0	10	  2	 	5
  • 데이터 샘플링 : 비율
df = pd.DataFrame({'서울' :[10,20,30,40,50,60],
				   '부산' :[1,2,3,4,5,6],
                   '대전' :[5,6,7,8,9,10]})
df

->
	서울	부산	대전
0	10	  1		5
1	20	  2		6
2	30	  3		7
3	40	  4		8
4	50	  5		9
5	60	  6		10


df.sample(frac = 0.5)

->
	서울	부산	대전
1	20	  2		6
2	40	  4		8
3	30	  3		7
  • 데이터 샘플링 : 개수
df.sample(n=4)

->
	서울	부산	대전
1	20	  2		6
0	10	  1		5
2	30	  3		7
4	50	  5		9

DataFrame 합치기

merge

  • pd.merge(left,right,how,on)
    - left : 합칠 왼쪽 데이터프레임
    • right : 합칠 오른쪽 데이터프레임
    • how : inner, left, right, outer
    • on : 두 데이터를 합칠 기준 컬럼
  • how 옵션
    - Inner: left, right에서 둘 다 존재하는 컬럼 데이터만 합침
    • left : left 데이터프레임 기준으로 합침
    • right : right 데이터프레임 기준으로 합침
    • outer : left, right의 모든 data 합침
(1) left 데이터 지역명 기준으로 right 데이터 결합

pd.merge(left = data1, right = data2, how = "left", on = "지역명")

->
	지역명	순위	금액	판매수		대기
0	서울	  1	   10	10.0	100.0
1	부산	  2	   20	20.0	200.0
2	광주	  3	   30	NaN		NaN

(2) right 데이터 지역명 기준으로 left 데이터 결합

pd.merge(left = data1, right = data2, how = "right", on = "지역명")

->
	지역명	순위 	금액 	판매수 	대기
0	서울	1.0	  10.0  10		100
1	부산	2.0	  20.0 	20		200
2	인천	NaN	  NaN 	30		300

(3) left, right 모든 데이터를 결합

pd.merge(left = data1, right = data2, how = "outer", on = "지역명")

->
	지역명	순위	금액	판매수		대기
0	서울	 1.0  10.0	10.0	 100.0
1	부산	 2.0  20.0	20.0	 200.0
2	광주	 3.0  30.0	NaN		 NaN
3	인천	 NaN  NaN	30.0 	 300.0

  • 인덱스 기준으로 결합
data1 = DataFrame([["서울",1,10],["부산",2,20],["광주",3,30]],columns = ['지역명','순위','금액'], index = ['1월','2월','3월'])
data1

->
	지역명	순위	금액
1월  서울   1	  10
2월  부산   2	  20
3월  광주   3	  30

data2 = DataFrame([["서울",10,100],["부산",20,200],["인천",30,300]], columns = ["지역명","판매수","대기"], index = ["1월","3월","5월"])
data2

->
	지역명	판매수	대기
1월  서울	 10	  100
3월  부산	 20	  200
5월  인천	 30	  300

pd.merge(left = data1, right = data2, left_index = True, right_index = True, how = "inner")

->
	지역명_x	순위	금액	지역명_y	판매수	대기
1월  서울		1	  10	서울		10	  100
3월  광주		3	  30	부산		20	  200
  • DataFrame 연산
df1 = DataFrame([[1,2],[3,4]])
df1

->
 	 0	 1
0	 1   2
1	 3   4

df2 = DataFrame([[10,20],[30,40]])
df2

->
	 0	 1
0	10	20
1	30	40

df1 + df2

->
	 0	 1
0	11	22
1	33	44

df1 - df2

->
	 0	 1
0	-9	-18
1	-27	-36

df1 * df2

->
	 0	 1
0	10	40
1	90	160

df1 / df2

->
	 0	 1
0	0.1	0.1
1	0.1	0.1

DataFrame 파일처리

csv 불러오기

pd.read_csv(FilePath,sep,header,names,index_col,skiprows,nrows,encoding)
FilePath : 파일경로, sep : 구분자, header(컬럼명) : 없을 경우 none
names : header가 없을시 컬럼명 입력 가능, skiprows : 파일에서 행을 건너뛰고 불러옴
index_col : 컬럼을 index로 사용, nrows : 입력한 개수만큼의 데이터만 읽음
encoding : 인코딩 타입 입력, 데이터가 한글이면 'CP949'

data = pd.read_csv("cdata.csv", encoding = 'cp949')
data.head()

->
	index	No	Name	Age   City
0	0		1	홍길동	  25	서울
1	1		2	김준기	  21	서울
2	2		9	이명식   22	부산
3	3		32	방준혁   24	광주
4	4		47	최명기   31	부산

csv 파일에 한글 데이터가 존재할때 encoding옵션 선택 후 불러오기
  • header
data = pd.read_csv("cdata_nohead.csv",encoding='cp949',header=None)
data.head()

->
상위 columns 추가
  • names : 컬럼명 지정
data = pd.read_csv("cdata_nohead.csv",
					encoding = 'cp949',
                    header = None,
                    names = ['index','번호','이름','나이','지역'],
                    )
data.head(2)

-> 컬럼에 index가 들어가고
  • index_col : 특정 컬럼을 인덱스로 지정
data = pd.read_csv("cdata_nohead.csv",
					encoding = 'cp949',
                    header = None,
                    names  = ['index','번호','이름','나이','지역'],
                    index_col = 'index'
                    )
data.head(2)

-> 기존 index에 index가 삽입됨
  • excel 파일 불러오기
data = pd.read_excel('cdata.xisx')
data

DataFrame 통계

  • describe() : 통계요약 (데이터개수, 평균, 표준편차, 최소값, 4분위값, 최대값)
data = pd.read_excel('cdata.xlsx',index_col='index')
data
1. sum() : 합계

data.sum()

2. mean() : 평균

data.mean()

3.std() : 평균

data.std()

4.var() : 분산

data.var()
  • sort_value() : 정렬
  1. ascending : True - 오름차순,False - 내림차순 정렬
  2. inplace : True 이면 정렬한 값을 DataFrame에 바로 반영
  3. by : 정렬할 기준 변수
  4. axis : 0 - 열방향 정렬, 1 - 행방향 정렬

1. 매출컬럼 기준으로 오름차순 정렬

data.sort_values(by = "매출", axis = 0).head()

->
		매출		사용자수
광주		7		30
서울		10		5
인천		20		3
부산		30		7

2. 매출컬럼 기준으로 내림차순 정렬

data.sort_values(by = "매출", axis = 1).head()

->
  • sort_index()

1. index명 기준으로 정렬

data.sort_index()

-> 
		매출		사용자수
광주		7			30
부산		30			7
서울		10			5
인천		20			3

2. 컬럼명 기준으로 정렬

data.sort_index(axis = 1)

->
		매출		사용자수
서울		10		5
부산		30		7
인천		20		3
광주		7		30

결측치 처리

  • 결측치 확인 : isnull()
df = pd.DataFrame({'서울' : [10, np.nan, 30, 40, np.nan, 60],
					'부산' : [1,2,np.nan,4,5,6],
                    '대전' : [5,np.nan,7,8,9,np.nan]})
df

---

df.isnull()

-> 
	서울		부산		대전
0	False	False	False
1	True 	False	True
2	False	True	False
3	False	False	False
4	True	False	False
5	False	False	True
  • null 제거 : dropna()
df.dropna()

->
	서울		부산		대전
0	10.01	1.0		5.0
3	40.0	4.0		8.0
  • null 대체 : fillna()
df.fillna(10)

->
	서울		부산		대전
0	10.0	1.0		5.0
1	10.0	2.0		10.0
2	30.0	10.0	7.0
3	40.0	4.0		8.0
4	10.0	5.0		9.0
5	60.0	6.0		10.0

df.fillna(df.mean())
-> 
	서울		부산		대전
0	10.0	1.0		5.0
1	35.0	2.0		7.25
2	30.0	3.6		7.0
3	40.0	4.0		8.0
4	35.0	5.0		9.0
5	60.0	6.0		7.25

colab
https://colab.research.google.com/drive/1bPu8PZb97jz0miZiCsHtpLH6TQtfM8pS?usp=sharing

profile
지지 않기

0개의 댓글