python(19) pandas 다루기

hyukstory 혁스토리·2020년 8월 28일
0

python

목록 보기
25/35

pandas로 csv 읽기

import pandas as pd

df = pd.read_csv('C:/Users/student/Desktop/python/P_data/ch9/test.csv')

print(df)

앞, 뒤 데이터 잘라 사용하기

import pandas as pd

df = pd.read_csv('C:/Users/student/Desktop/python/P_data/ch9/test.csv')

print('상위 데이터만 출력')
print(df.head())

print('하위 데이터만 출력')
print(df.tail())

슬라이싱 하기

print(df[0:3])  # row 기준 자료 출력 
print(df[0:2])
print(df[0:1])

iloc 슬라이싱

예전에는 df.ix -> 업데이트 후엔 df.iloc[[행],[열]]

print(df.iloc[1:4, :0]) # error 
print(df.iloc[1:4, :1])
print(df.iloc[1:4, :2])
print(df.iloc[1:4, :3])
print(df.iloc[1:4, :4])

print(df.iloc[:, 1])
print(df.iloc[1, 1])
print(df.iloc[1, 2])

print(df['나이'])
print(df['이름'])
print(df['주소'])

데이터 재조합

name = df['이름']
age = df['나이']

print(name)
print(age)

print('axis 가 1일때 - 칼럼 단위 합치기')
p1 = pd.concat([name,age],axis=1)
print(p1)


print('axis 가 0일때 - 로우 단위 합치기')
p2 = pd.concat([name,age],axis=0)
print(p2)

filtering

print(df['나이']>30)   # true or false 출력 
print(df[df['나이']>30]) # 값 출력 

print(df['나이'].notnull()) 
print(df[df['나이'].notnull()])

print(df['나이'] == '') # 에러 칼럼 전체 비교 elementwise comparison failed 나온다 
print(df['나이'] == '1') # 에러 칼럼 전체 비교 elementwise comparison failed 나온다
print(df['나이'] == 1) # ok
print(df['이름'] == 1) # ok 

* data frame

컬럼은 딕셔너리, 로우는 각 키에 저장되는 리스트

from pandas import DataFrame

raw_data = {'이름': ['철구1', '맹구2', '짱구3', '유리4', '철구5', '맹구6', '짱구7', '유리8',],
            '나이': [20, 21, 20, 12, 30, 31, 40, 30],
            '주소': ['경기도', '강원도', '경상도', '전라도', '경기도', '강원도', '경상도', '전라도', ]}

data = DataFrame(raw_data)
print(data)

index, column 지정

data = DataFrame(raw_data,columns=['나이','주소'],index=raw_data['주소'])
print(data)

data1 = DataFrame(raw_data,columns=['나이'],index=raw_data['주소'])
print(data1)
print(data1['강원도'])  # 키에러  
print(data1[data1.iloc['강원도']]) # 키 인것 가져오기  error

print(data1.loc['강원도']) # 키 인것 가져오기  ok - row data 가져옴 
print(data1.loc['경상도']) # 키 인것 가져오기  ok - row data 가져옴 
print(data1[data1['나이'] == 20]) # 키가 아닌것 가져 오기 ok 
type(data1)

저장하기

from pandas import DataFrame

data = {
    '이름': ['철구1', '맹구2', '짱구3', '유리4', '철구5', '맹구6', '짱구7', '유리8'],
    '나이': [20, 21, 20, 12, 30, 31, 40, 30],
    '주소': ['경기도', '강원도', '경상도', '전라도', '경기도', '강원도', '경상도', '전라도']
}

df = DataFrame(data, columns=['나이', '주소', '이름'])

df.to_csv('9.41.csv',encoding='euc-kr')

pandas 기초 익히기

import pandas as pd
import numpy as np


## pandas의 데이터 유형 중 기초 : Series
s = pd.Series([1,3,5,np.nan,6,8])
s

## pandas 데이터 중 날짜형 데이터 : data_range
dates = pd.date_range('20200824',periods=6)
dates

## DataFrame 유형의 데이터 만들기
df = pd.DataFrame(np.random.randn(6,4), #6행 4열의 random 변수 생성
                  index = dates,        #위에서 만든 날짜형 데이터를 값으로 받음
                  columns=['a','b','c','d']) # 열 제목 지정
df
df.head(3)
df.info()
df.index
df.columns
df.describe() # 통계적 개요 확인
df.sort_values(by='b', ascending=False) # b column에만 적용되며 raw data에 저장되는 사항은 아님
df['a']


# 슬라이싱 옵션
# 1. loc(location):위치값을 조정->열 데이터 기준
# 2. iloc:행과 열의 번호를 이용하여 특정 데이터에 접근

df.loc[dates[0],'a']
df.iloc[0,0]
# 같은 값을 loc,iloc로 각각 인덱싱함.

df[df.a>0]  # a열 중에서 0보다 큰 index만 나타내기
df[df>0] # 전체 값이 0보다 큰지 비교



# copy dataframe

df2 = df.copy()
df2
df2['e'] = ['one','two','three','four','five','six']
df2


# 조건을 거는 isin 명령어

df2['e'].isin(['two','four']) # 논리값 반환

df2[df2['e'].isin(['two','four'])] # 조건을 만족하는 True행의 값 반환


# apply 함수 적용

df.apply(np.cumsum) # 누적합
df.apply(lambda x: x.max() - x.min()) # 최대값과 최소값 사이의 차이를 계산
#lambda 함수: 한 줄에 조건문을 선언

pandas 고급 기능 - 두 DataFrame 병합하기


df1 = pd.DataFrame({'A' : ['A0', 'A1', 'A2', 'A3'],
                    'B' : ['B0', 'B1', 'B2', 'B3'],
                    'C' : ['C0', 'C1', 'C2', 'C3'],
                    'D' : ['D0', 'D1', 'D2', 'D3']},
                    index = [0,1,2,3])



df2 = pd.DataFrame({'A' : ['A4', 'A5', 'A6', 'A7'],
                    'B' : ['B4', 'B5', 'B6', 'B7'],
                    'C' : ['C4', 'C5', 'C6', 'C7'],
                    'D' : ['D4', 'D5', 'D6', 'D7']},
                    index = [4,5,6,7])



df3 = pd.DataFrame({'A' : ['A8', 'A9', 'A10', 'A11'],
                    'B' : ['B8', 'B9', 'B10', 'B11'],
                    'C' : ['C8', 'C9', 'C10', 'C11'],
                    'D' : ['D8', 'D9', 'D10', 'D11']},
                    index = [8,9,10,11])



# 열 방향으로 단순 합치기 : concat 
result = pd.concat([df1, df2, df3])
result


result = pd.concat([df1, df2, df3], keys = ['x', 'y', 'z'])
result

result.index
result.index.get_level_values(0)
result.index.get_level_values(1)
result.index.get_level_values(3)




df1
df4 = pd.DataFrame({'B' : ['B2', 'B3', 'B6', 'A7'],
                    'D' : ['D2', 'D3', 'D6', 'D7'],
                    'F' : ['F2', 'F3', 'F6', 'F7']},
                    index = [2,3,6,7])




# 행 방향으로 합치기  : concat( 옵션 : axis = 1)
result = pd.concat([df1, df4], axis = 1)
result

# 공통된 index로 합치기
result = pd.concat([df1, df4], axis = 1, join = 'inner')
result

# 열 방향으로 합치면서 두 데이터의 index 무시하고 새로 index 부여
result = pd.concat([df1, df4], ignore_index = True)
result




left = pd.DataFrame({'key' : ['Ko', 'K4', 'K2', 'K3'],
                     'A' : ['A0', 'A1', 'A2', 'A3'], 
                     'B' : ['B0', 'B1', 'B2', 'B3']})


right = pd.DataFrame({'key' : ['Ko', 'K1', 'K2', 'K3'],
                     'C' : ['C0', 'C1', 'C2', 'C3'], 
                     'D' : ['D0', 'D1', 'D2', 'D3']})





# merge : 합치기
pd.merge(left, right, on = 'key')                # 공통된 key
pd.merge(left, right, how = 'left', on = 'key')  # left 데이터의 key 기준
pd.merge(left, right, how = 'right', on = 'key') # right 데이터의 key 기준
pd.merge(left, right, how = 'outer', on = 'key') # 모든 key 값 (합집합)
pd.merge(left, right, how = 'inner', on = 'key') # 공통된 key 값 (교집합)
profile
문돌이의 고군분투 개발 공부

0개의 댓글