본문 바로가기
데이터 분석 및 시각화

[데이터분석] 넘파이&판다스

by 바다의 공간 2024. 8. 19.

판다스 넘파이들 중 간단한것들을 시도해봤습니다.

넘파이에서의  axis=0, axis=1이 나오게되는데 0은 열을 의미하고 1은 행을 의미합니다.

sort함수는 axis에서 사용하게 됩니다.(0은 열과 비슷하니 0=열, 1은 행으로 외우려고 합니다)

 

#넘파이

#numpy&pandas.py

def p(str):
    print(str, '\n')

##넘파이 배열

import numpy as np

# 파이썬 리스트로 넘파이 배열 만들기
ar1 = np.array([1, 2, 3, 4 ,5]) #1차원 배열
p(ar1) #리스트로 나오지만 넘파이 배열임

ar2 = np.array([[1,2,3],[4,5,6]]) #2차원 배열
p(ar2) #리트스 안의 리스트로 감싸주면 2차원 배열이됨

#크기가 3인 1차원 난수 배열
ar3= np.random.randn(3)
p(ar3)
# 2행 3열의 2차원 난수 배열
ar4 = np.random.rand(2, 3)
p(ar4)

#크기가 5인 0으로 채워진 배열
ar5= np.zeros(5)
p(ar5)
#크기가 5인 1로 채워진 배열
ar5_1 = np.ones(5)
p(5_1)

#크기가 2행 3열인 0으로 채워진 2차원 배열
ar6_1 = np.zeros((2,3))
p(ar6_1)

#20부터 200-1까지 10씩 증가한 배열
ar7 = np.arange(20, 200, 10)
p(ar7)

#3행 6열 배열로 모양바꾸기(재배치)
ar8 = ar7.reshape(3, 6)
p(ar8)

#1부터 20까지 1씩 증가한 배열
ar1 = np.arange(1, 21, 1)
p(ar1)
p(ar1[1]) #인덱스가 1인(즉 두번째 요소)

#2행 10열로 배열 재배치
ar2 = ar1.reshape(2, 10)
p(ar2)
ar2[1][1] = 100 #2행 2열의 값을 100으로 변경
p(ar2)

ar1 = np.arange(1, 11, 1) # 1~10
p(ar1)
ar2 = ar1 + 3 # 배열 각 요소에 숫자를 더한 배열
p(ar2)
ar3 = ar1 * 2 # 배열 각 요소에 숫자를 곱한 배열
p(ar3)

#배열 요소의 개수
ar1 = np.array([[5,7,9], [-7, -6, 19], [6, 9, 11]])
p(len(ar1)) #요소의 개수
p(len(ar1[0])) #첫번째 요소(1차원 배열)의 개수




#배열함수
p(ar1.sum()) #합계
p(ar1.mean()) #평균
p(ar1.max()) #최대값
p(ar1.min()) #최소값
p(ar1.max(axis=0)) #각 열의 요소 중 가장 큰 값
p(ar1.max(axis=1)) #각 행의 요소 중 가장 큰 값
p(ar1.min(axis=0)) #각 열의 요소 중 작은 값
p(ar1.min(axis=1)) #각 행의 요소 중 작은 값
#0 = 열, 1=행

ar1= np.array([[5, 7, 9], [-7, -6, 19], [6, 9, 11]])
# ar1배열의 모든 요소에 대해서  0보다 크면 True, 작으면 False
p(ar1>0)
#음수의 개수
m_count = (ar1<0).sum()
p(m_count)

#where : 배열에 조건 부여
ar2= np.where(ar1<0, 0, ar1)
p(ar2)

#배열 정렬
ar1= np.array([[5, 7, 9], [-3, -6, 19], [6, 4, 11]])
p(ar1)
ar1.sort(0) #열 기준으로 정렬
p(ar1)
ar1.sort(1) #행기준으로 정
p(ar1)

 

#판다스

#Series : 인덱스(숫자 또는 문자)가 있는 1차원 데이터 구조

#DataFrame : 인덱스(숫자 또는 문자)가 있는 2차원 데이터 구조

#판다스
#Series :인덱스(숫자 또는 문자)가 있는 1차원 데이터 구조
#dataFrame : 인덱스(숫자 또는 문자)가 있는 2차원 데이터 구조


#판다스 시리즈 객체 설정
sr1= pd.Series([10,30,20,40,60])
p(sr1) #시리즈
p(sr1.values) #값
p(sr1.index) #인덱스
p(sr1[2]) #인덱스 2의 값



#문자열로 인덱스 설정
sr1 = pd.Series([10,30,20,40,60], index=['a', 'b', 'c', 'd', 'e'])
p(sr1[1]) #두번째 요소
p(sr1['b']) #두번째 요소
p(sr1[[1,2]])#두번째부터 세번째 요소
p(sr1[['a','c']]) #첫번째,세번째 요소
p(sr1[1:4]) # 두번째부터 네번째 요소
p(sr1['b':'d']) #두번째부터 네번째 요소
# ,는 다 가져오는거고 :은 잘라서 가져오게 됩니다.


# 2행 3열 구조
df1 = pd.DataFrame([[10,20,30], [40,50,60]])
p(df1)

#딕셔너리로 DataFrame 생성
dic1 = {
    'fruit': ['사과', '베', '감', '굴', '바나나'],
    'price': [100, 200, 150 ,50 ,200],
    'qty': [10, 25, 30, 20, 15] #수량
}

df1 = pd.DataFrame(dic1)
p(df1)

#행의 인덱스 설정
df1 = pd.DataFrame(dic1, index=['a','b','c','d','e'])
p(df1)

# 열 인덱스명 변경
df1.rename(columns={
    'fruit': '과일',
    'price': '가격',
    'qty': '수량'
}, inplace=True)
p(df1)

# 행 인덱스명 변경
df1.rename(index={
    'a': '01',
    'b': '02',
    'c': '03',
    'd': '04',
    'e': '05',
},inplace=True)
p(df1)

#csv 데이터로 데이터프레임 생성
df1 = pd.read_csv('../assets/df_sample.csv')
p(df1)
df1.head()
p(df1.head(5)) #상위 5개 행
df1.info() #데이터프레임의 구조
p(df1.describe(include='all')) #기본 통계랑

#데이터 프레임의 통계 함수
p(df1['중간'].mean()) #중간고사의 평균 데이터
p(df1[['중간', '기말']].mean()) #중간, 기말 평균
p(df1['학번'].min()) #학번 최소값
p(df1[['중간','기말']].max()) #중간, 기말 최대값
p(df1[['중간','기말']].std()) #표준편차
p(df1[['중간','기말']].var()) #분산
p(df1['퀴즈'].value_counts())#값 마다의 개수
p(df1[['중간', '기말']].corr()) #상관분석


#특정 컬럼을 행인덱스로 지정
df1.set_index('학번') #학번 열을 행의 인덱스로 지정
p(df1)
df1.index = df1['학번'] #학번 열의 값을 읽어서 인덱스로 지정
p(df1)

#loc : 이름으로 접근, iloc:인덱스로 접근
df1.set_index('학번', inplace=True)
p(df1)
p(df1.loc['S01', '중간']) #인덱스명과 열이름 사용해서 접근
p(df1.loc['S01', '기말']) #인덱스명과 열이름 사용해서 접근
p(df1.iloc[1, 0])
p(df1.iloc[2, 2])
p(df1.loc['S05']) # S05의 행 인덱스에 해당하는 열인덱스와 값
p(df1.iloc[3]) #인덱스 3번(S04)행 인덱스에 해당하는 열 인덱스와 값
p(df1['중간']) #중간 열인덱스에 해당하는 행인덱스와 값
p(df1[['중간', '기말']]) #중간, 기말 열인덱스에 해당하는 행인덱스와 값


df1 =pd.read_csv('../assets/df_sample.csv')
p(df1)
df2 = df1.drop(0) #0번 행 삭제
p(df2)
df3 = df2.drop('퀴즈', axis=1) #퀴즈 열 삭제
p(df3)


#데이터 프레임 정렬
df1.set_index('학번', inplace=True)#학번 열을 행인덱스로
df2 = df1.sort_index(ascending=False) #ascending = 오름차순
p(df2)

#기말 열의 값으로 오름차순 정렬
df3 = df1.sort_values(by='기말', ascending=True)
p(df3)

 

 


 

순서 함수(매소드) 설명(역할)
1 np.random.randn(3) 크기가 3인 1차원 난수 배열
2 np.random.randn(2,3) 크기가 2행 3열의 2차원 난수 배열
2 np.zeros(2) 0으로 채워진 크기가 2인 1차 배열
3 np.zeros((2,3)) 크기가 2행 3열인 0으로 채워진 2차열 배열 (튜플형식으로 써야함)
4 np.ones(5) 크기가 5인 1로 채워진 배열
5 np.arange(20,200,10) 20부터 200-1까지 10씩 증가한 배열
6 ar7.reshape(3,6) ar7행렬을 3행 6열 배열로 재배치하기
7 np.where(ar1<0, 0, ar1) 배열에 조건 부여(ar1이 0보다 작으면 0 그렇지 않으면 그냥 ar1)
8 np1.sort(0)
np1.sort(1)
열을 기준으로 정렬
행 기준으로 정렬
9 df1.rename(columns={
    'fruit': '과일',
    'price': '가격',
    'qty': '수량'
}, inplace=True)
p(df1)
열 인덱스명 변경
10 df1.rename(index={
    'a': '01',
    'b': '02',
    'c': '03',
    'd': '04',
    'e': '05',
},inplace=True)
p(df1)
행 인덱스명 변경
11
변수 = pd.read_csv('경로')
#판다스 csv파일 읽어서 df생성
12 p(df1.describe(include='all')) 기본 통계 확인
#카운트, 유니크 , 탑, freq, mean, std, min, 25%, 50%, 75%, max