-
[Pandas] Index 활용 / data 입출력 / 연산NAN/Python 2021. 7. 3. 15:59728x90
Index 활용
행/열 추가
#dataframe 생성 test_data = {'이름':['상우','현정','문영','동엽','우제'], '국어':[85,88,90,50,70], '수학':[57,90,100,78,66], '영어':[85,89,67,98,98], '과학':[50,78,98,50,69], '체육':[94,80,99,69,100]} df = pd.DataFrame(test_data) # 새로운 열 생성하기 df['체육'] = 90 df['사회'] = [90,60,77,43,42] print(df) print() # 새로운 행 생성하기 df.loc[5] = 100 df.loc[6] = ['다니엘',90,91,50,33,80,90] df.loc['일곱'] = ['마크',77,48,78,96,11,54] print(df) #새로운 열 생성 이름 국어 수학 영어 과학 체육 사회 0 상우 85 57 85 50 90 90 1 현정 88 90 89 78 90 60 2 문영 90 100 67 98 90 77 3 동엽 50 78 98 50 90 43 4 우제 70 66 98 69 90 42 # 새로운 행 생성 이름 국어 수학 영어 과학 체육 사회 0 상우 85 57 85 50 90 90 1 현정 88 90 89 78 90 60 2 문영 90 100 67 98 90 77 3 동엽 50 78 98 50 90 43 4 우제 70 66 98 69 90 42 5 100 100 100 100 100 100 100 6 다니엘 90 91 50 33 80 90 일곱 마크 77 48 78 96 11 54코드를 천천히 읽어보면 데이터에 행/열을 어떻게 추가할 수 있는지 패턴을 알 수 있다.
임의 데이터로 정렬하기
Reshaping Data
# dataframe 생성 test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'], '사과' : [1000, 900, 1200, 500, 800], '배' : [1100, 900, 1000, 1100, 2000], '딸기' : [800, 900, 600, 900, 1200], '포도' : [1500, 900, 1000, 800, 900]} df = pd.DataFrame(test_data) df 상호명 사과 배 딸기 포도 0 상우네 1000 1100 800 1500 1 현정이네 900 900 900 900 2 문영이네 1200 1000 600 1000 3 동엽이네 500 1100 900 800 4 우제네 800 2000 1200 900 new_df1 = df.set_index(['상호명']) new_df1 new_df2 = df.set_index(['사과']) new_df2 상호명 배 딸기 포도 사과 1000 상우네 1100 800 1500 900 현정이네 900 900 900 1200 문영이네 1000 600 1000 500 동엽이네 1100 900 800 800 우제네 2000 1200 900기존 데이터에서 가지고 있는 열 column을 index로 지정하여 사용한다. 이와 같은 방법을 사용하면 column이 row index
적용되어 새로운 DataFrame이 생성되어 반환되기 때문에, 만약 원본 데이터에 변경 값을 적용하고 싶다면
df.set_index('column', inplace=True) 와 같은 방법으로 적용할 수 있다.
reindex( )
기존 DataFrame에 존재하지 않는 column을 row index로 사용하고자 할 때 쓰이는 메서드로,
존재하지 않는 row index가 추가될 경우 해당 row의 value 는 NaN(Not a Number 잘 못 입력)을 띄우게 되는데
데이터를 특정 값으로 채우고자 한다면 fill_value 옵션을 사용해야한다.
# dataframe 생성 test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'], '사과' : [1000, 900, 1200, 500, 800], '배' : [1100, 900, 1000, 1100, 2000], '딸기' : [800, 900, 600, 900, 1200], '포도' : [1500, 900, 1000, 800, 900]} #row 인덱스를 무작위로 선정 df = pd.DataFrame(test_data, index=[4,2,1,0,3]) df 상호명 사과 배 딸기 포도 4 상우네 1000 1100 800 1500 2 현정이네 900 900 900 900 1 문영이네 1200 1000 600 1000 0 동엽이네 500 1100 900 800 3 우제네 800 2000 1200 900 # reindex를 사용해 새로운 DataFrame 생성 new_index = [0,1,2,3,4,5] reindex_df1 = df.reindex(new_index) reindex_df1 상호명 사과 배 딸기 포도 0 동엽이네 500.0 1100.0 900.0 800.0 1 문영이네 1200.0 1000.0 600.0 1000.0 2 현정이네 900.0 900.0 900.0 900.0 3 우제네 800.0 2000.0 1200.0 900.0 4 상우네 1000.0 1100.0 800.0 1500.0 5 NaN NaN NaN NaN NaN# fill_value로 NaN데이터 채우기 reindex_df2 = df.reindex(new_index, fill_value = 123) reindex_df2 상호명 사과 배 딸기 포도 0 동엽이네 500 1100 900 800 1 문영이네 1200 1000 600 1000 2 현정이네 900 900 900 900 3 우제네 800 2000 1200 900 4 상우네 1000 1100 800 1500 5 123 123 123 123 123
reset_index( )
set_index를 통해 만들어진 row index를 초기화할 때 사용된다.
reindex_df2.reset_index reindex_df2 상호명 사과 배 딸기 포도 0 동엽이네 500 1100 900 800 1 문영이네 1200 1000 600 1000 2 현정이네 900 900 900 900 3 우제네 800 2000 1200 900 4 상우네 1000 1100 800 1500 5 123 123 123 123 123
데이터 순차 정렬
sort_index( )
무작위로 선정된 row index를 오름 차순 혹은 내림 차순으로 정렬해 주는 기능을 한다.
ascending=True, 이 값이 True 이면 오름 차순, False면 내림 차순으로 진행
# dataframe 생성 test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'], '사과' : [1000, 900, 1200, 500, 800], '배' : [1100, 900, 1000, 1100, 2000], '딸기' : [800, 900, 600, 900, 1200], '포도' : [1500, 900, 1000, 800, 900]} #row 인덱스를 무작위로 선정 df = pd.DataFrame(test_data, index=[4,2,1,0,3]) # 오름 차순 정렬 df.sort_index(ascending=True) 상호명 사과 배 딸기 포도 0 동엽이네 500 1100 900 800 1 문영이네 1200 1000 600 1000 2 현정이네 900 900 900 900 3 우제네 800 2000 1200 900 4 상우네 1000 1100 800 1500sort_values( )
values 값으로도 오름 차순, 내림 차순을 결정할 수 있다.
# dataframe 생성 test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'], '사과' : [1000, 900, 1200, 500, 800], '배' : [1100, 900, 1000, 1100, 2000], '딸기' : [800, 900, 600, 900, 1200], '포도' : [1500, 900, 1000, 800, 900]} # sort_value를 통해 오르 내림 차순 df = pd.DataFrame(test_data) apple_ascending = df.sort_values('포도',ascending=True) apple_ascending 상호명 사과 배 딸기 포도 3 동엽이네 500 1100 900 800 1 현정이네 900 900 900 900 4 우제네 800 2000 1200 900 2 문영이네 1200 1000 600 1000 0 상우네 1000 1100 800 1500데이터 삭제
drop( )
# dataframe 생성 test_data = {'상호명' :['상우네', '현정이네', '문영이네', '동엽이네', '우제네'], '사과' : [1000, 900, 1200, 500, 800], '배' : [1100, 900, 1000, 1100, 2000], '딸기' : [800, 900, 600, 900, 1200], '포도' : [1500, 900, 1000, 800, 900]} df = pd.DataFrame(test_data) new_df1 = df.set_index(['상호명']) # 데이터 삭제하기 ndf2 = df.drop(['사과','딸기'],axis=1) ndf2 상호명 배 포도 0 상우네 1100 1500 1 현정이네 900 900 2 문영이네 1000 1000 3 동엽이네 1100 800 4 우제네 2000 900이처럼 drop을 사용하여 column을 제거할 수 있는데 주의할 점은 axis를 통해 축을 반드시 지정해주어야 한다.
ndf3 = df.drop([0,4]) ndf3 상호명 사과 배 딸기 포도 1 현정이네 900 900 900 900 2 문영이네 1200 1000 600 1000 3 동엽이네 500 1100 900 800row 삭제는 비교적 간단하게 정수형 위치 index 혹은 지정한 index로 삭제할 수 있다,
만약 삭제, 추가 등 모든 기록을 포함한 데이터를 남기고 싶다면 inplace를 통해 원본에 저장하자
Pandas Data 입출력
CSV 파일 읽기 / 저장
읽기 read_csv( )
df = pd.read_csv( ' 파일 이름. csv')
저장 to_csv( )
df.to_csv( './ 파일 이름. csv')JSON 파일 읽기 / 저장
읽기 read_json( )
df = pd.read_json( ' 파일 이름. json ')
저장 to_json( )
df.to_json( '. / 파일 이름. josn ')
Pandas 연산
Data Frame과 사칙 연산을 하게 되면 Data Frame의 각 원소와 숫자가 하나하나 연산되어 반환된다.
예시에는 나눗셈만 연산되어 나왔지만 다른 연산도 가능하다.
dict_data = {'c0' : [1,2,3], 'c1' : [4,5,6], 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]} df = pd.DataFrame(dict_data) add = df + 10 add sub = df - 10 sub mul = df * 10 mul div = df / 10 div c0 c1 c2 c3 c4 0 0.1 0.4 0.7 1.0 1.3 1 0.2 0.5 0.8 1.1 1.4 2 0.3 0.6 0.9 1.2 1.5Data Frame & Data Frame
Data Frame끼리 연산을 하게 되면 같은 위치에 있는 원소끼리 계산하여,
새로운 반환 값으로 Data Frame을 생성하게 된다. 만약 원소의 개 수가 일치하지 않을 경우 NaN으로 표기된다.
dict_data = {'c0' : [1,2,3], 'c1' : [4,5,6], 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]} dict_data1 = {'c0' : [1,2,3], 'c1' : [4,5,6], 'c2' : [7,8,9], 'c3' : [10,11,12], 'c4' : [13,14,15]} df = pd.DataFrame(dict_data) df1 = pd.DataFrame(dict_data1) df * df1 c0 c1 c2 c3 c4 0 1 16 49 100 169 1 4 25 64 121 196 2 9 36 81 144 225
통계 메서드 알아보기
from random import * # 난수 생성 data1 = [] data2 = [] for i in range(0,10): data1.append(uniform(0,1)) for i in range(0,10): data2.append(uniform(0,2)) # 데이터 프레임 생성 dict_data = {'first':data1, 'second':data2} index_data = {'zero','1st','2nd','3rd','4th','5th','6th','7th','8th','9th'} df = pd.DataFrame(dict_data, index= index_data)#평균값 mean_val = df.mean() #first 평균 first_mean = df['first'].mean() #second 평균 second_mean = df['second'].mean() print(mean_val) print() print(f'first 평균 : {first_mean}') print(f'second 평균 : {second_mean}') first 0.593488 second 1.545130 dtype: float64 first 평균 : 0.5934881824450425 second 평균 : 1.5451299685587607#중앙값 median_val = df.median() #first 중앙 first_median = df['first'].median() #second 중앙 second_median = df['second'].median() print(median_val) print() print(f'first 중앙 : {first_median}') print(f'second 중앙 : {second_median}') first 0.625385 second 1.536886 dtype: float64 first 중앙 : 0.6253845527935137 second 중앙 : 1.536885946049231# 최댓값 max_val = df.max() #first 최대값 first_max = df['first'].max() #second 최대값 second_max = df['second'].max() print(max_val) print() print(f'first 최대값 : {first_max}') print(f'second 최대값 : {second_max}') first 0.948949 second 1.887554 dtype: float64 first 중앙 : 0.9489493550940792 second 중앙 : 1.887553869277309# 최소값 min_val = df.min() #first 최소 first_min = df['first'].min() #second 최소 second_min = df['second'].min() print(min_val) print() print(f'first 최소 : {first_min}') print(f'second 최소 : {second_min}') first 0.245787 second 1.204534 dtype: float64 first 중앙 : 0.24578660623413828 second 중앙 : 1.2045344012730197# 표준편차 std_val = df.std() #first 표준편차 first_std = df['first'].std() #second 표준편차 second_std = df['second'].std() print(std_val) print() print(f'first 표준편차 : {first_std}') print(f'second 표준편차 : {second_std}') first 0.253994 second 0.180444 dtype: float64 first 표준편차 : 0.2539938802224056 second 표준편차 : 0.18044385743988223#상관계수 ndf.corr()

'NAN > Python' 카테고리의 다른 글
[Pandas] 기초 활용_Titanic (0) 2021.07.03 [Pandas] 소개 / 시리즈와 데이터프레임 (0) 2021.07.02 [NumPy] 객체 저장 / 로드 (0) 2021.07.01 [NumPy_5] 난수 / 고유 항목 다루기 / 행렬 전치 / 배열 뒤집기 재구성 (0) 2021.06.30 [NumPy_4] 기존 데이터에서 배열 만들기 / 배열 연산 (0) 2021.06.30