Pandas Cheat Sheet
Pandas 설명 적혀 있는 파일
dataFrame 1 - 데이터프레임 생성
#리스트에 리스트, 리스트에 딕셔너리면 2차원배열임
import pandas as pd
import numpy as np
data = [[10,20], [30,40], [50,60], [70,80]]
df = pd.DataFrame(data, index=['a','b','c','d'], columns = ['kor', 'eng'])
print (df)
data = [{'kor':10, 'eng':20},
{'kor':30, 'eng':40},
{'kor':50, 'eng':60},
{'kor':70, 'eng':80}]
df = pd.DataFrame(data)
df
data = {'kor':[10,30,50,70], 'eng':[20,40,60,80]}
df = pd.DataFrame(data)
df
dataFrame 2 - 데이터프레임 속성
import pandas as pd
import numpy as np
data = {'kor':[10,30,50,70], 'eng':[20,40,60,80]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df
df.ndim #차원구조
df.shape #4행 2열
df.size # value 갯수
df.index
df.columns
df.dtypes
df.values #numpy.ndarray 리스트구조로 반환

df.info() # index, columns, dtypes을 한번에 조회하고 싶다면 Info()를 사용한다.
특정 칼럼을 index로 사용할 수도 있다.

#Series 와 비교
a = [10,20,30]
s = pd.Series(a)
s
s.values
dataFrame 3 - 인덱스 사용
import pandas as pd
import numpy as np
data = { 'kor':[10,30,50,70],
'eng':[20,40,60,80],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df
#sr['a'] #sr[0] #Series에서는 index명
s = df['kor'] #데이터프레임에서는 column명, column명으로 추출한 객체는 Series이다.
type(s)
df['eng']
#복수개 데이터 선택
#sr[ ['a','c']]
df[ ['kor', 'eng']]
df[0:3] #slicing 의 경우에는 row를 의미하게 되어 column을 안 넣어도 가능하다
df['a':'c']
#sr[0], sr['a'] -- dataFrame에서는 안됨
#sr.iloc[0], sr.loc['a'] -- dataFrame에서도 가능
df.iloc[0]
df.loc['c']
df.iloc[0:3] #df[0:3]과 동일함
df.iloc[0:3,1:3] #도 가능 but, df[0:3,1]은 불가능
print (df.iloc[[1,3], 1])
print (type(df.iloc[[1,3], [1]]))#리스트면 복수개로 인식하여 dataFrame으로 나옴
df.iloc[0:3, 0::2]
df.iloc[0:3,[0,2]]
df.iloc[[1,3]] #이런 경우는 복수개의 row
df.loc['a':'c']
df.loc['a':'c', 'eng']
df.loc['a':'c', ['kor','math']]
dataFrame 4 - 데이터프레임 연산
#연산
import pandas as pd
import numpy as np
data = { 'kor':[10,30,50,70],
'eng':[20,40,60,80],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df = df+2 #모든 데이터에 연산이 들어감
df
df['math'] = df['math'] + 2 #특정 부분에만 적용하고 싶다면
df
df.iloc[0:2,0:2] #a~b, kor~eng만 선택
df.iloc[0:2, 0:2] = 3 # 일정 부분 값만 바꾸기
df.iloc[0:2, 0:2] = df.iloc[0:2, 0:2] + 3
df.iloc[0:2, 0:2]
data = { 'kor':[10,30,50,70],
'eng':[20,40,60,80],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df.loc['b'] = df.loc['b']+5
df
df.loc['b'] = [10,20,30]
df['eng'] = [10,20,30,40]
df.iloc[2:4, 1:3] = [[1,2],[3,4]]
df
df[ [True, False, False, True] ]#데이터 프레임도 Series와 똑같이 row단위임
df[ df['kor']>30 ].iloc[:,0:3] # [F, F, T, T] 불리안 인덱스 값이 적용된 것,
df.query('kor>30') #dataFrame은 query라는 멤버함수를 따로 제공하여 준다.
df1 = df[ (df['kor']==10) | (df['kor']==50) ]
print(df1.kor)
df.query('kor == 10 or kor == 50')['kor'] #query 안에서는 or 연산자를 쓸 수 있음
df [ (df['kor']>=10) & (df['kor']<50 ) ]
df.query('10<=kor<50')
df.query('kor>=10 and kor<50')
#Series간 연산을 하는 경우 index를 기반으로 한다.
#따라서 s1+s2에서 index b는 공통으로 존재하여 연산 가능하여 -10이 되었지만, index a와 c는 s1,s2 두 Series에서 모두 존재하지 않아서 연산이 되지 않아 아래처럼 NaN이 나온 것을 볼 수 있다.

dataFrame 5 - 데이터 추가 삭제
#데이타 추가 삭제
import pandas as pd
import numpy as np
data = { 'kor':[10,30,70,70],
'eng':[20,40,80,60],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df.loc['e'] = [10,20,30] #존재하지 않는 인덱스는 추가
df
df['my'] = [1,2,3,4,5]
df
df['sum'] = df['kor']+df['eng']
df
data = { 'kor':[10,30,70,70],
'eng':[20,40,80,60],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df.loc['b':, 'sci'] = [1,2,3] # sci라는 column이 없기때문에 추가됨
print(df)
df = df[['eng', 'math', 'kor']] #columns 의 순서를 바꿀 수 있다
df.drop('a') #index를 통한 삭제나, columns을 통한 삭제 전부 가능
df.drop(index=['a','d'])
df.drop(columns=['eng', 'kor'])
df.loc['b':, 'aaa'] =[2,3,4]
df.loc['c':, 'bbb'] =[3,4]
df
df1 = df
df1
#NaN 데이터 처리
df1.dropna(axis=0) # NaN row 삭제
df1.dropna(axis=1) # NaN column 삭제
df1.dropna(subset=['aaa']) #aaa에 있는 NaN row만 삭제. axis default는 row이기에,
df1.dropna(subset=['aaa', 'bbb'])
#df1.dropna(axis=1, subset=['aaa']) 가 안되는 이유는 NaN데이터가 하나 있다고 해서 columns을 날리는건 이상하기 때문에? 나의 생각
df1.fillna(0) # Nan 데이터 0으로 채워줌
df1['aaa'].fillna(0, inplace=True) #Series에도 fillna라는 멤버함수가 있다.
df1
df.sort_values(by='kor', ascending=False) #kor 점수 기준으로 정렬
df.sort_values(by=['kor', 'eng'], ascending=False) #kor 점수 기준으로 정렬, 동률인 경우 second 인자 기준으로 정렬
df.sort_values(by=['kor', 'eng'], ascending=[True, False]) #각 columns별 정렬 기준을 다르게 지정할 수 있음
df.sort_index(ascending=False) #인덱스 기준으로 정렬 가능
dataFrame 6 - 통계관련 멤버함수 이용
#통계 관련 멤버함수 사용
import pandas as pd
import numpy as np
data = { 'kor':[10,30,70,70],
'eng':[20,40,80,60],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df
df.max(axis=0) #column별 가장 큰 값 Series로 나옴
df.max(axis=1) #각 row별 가장 큰 값
df.max().max() #데이터프레임 전체에서 가장 큰 값, Series.max()
df.min()
df.min(axis=1)
df.min().min()
df.sum() #column별 총 합
df.sum(axis=1) #row별 총 합
df.sum().sum()
df.mean() #칼럼별 평균값
df.mean(axis=1) #행별 평균값
df.median()
df.std()
df.quantile([0.25, 0.5, 0.75], axis=1)
df.describe()
df.describe().loc['mean', 'kor']
df.describe().loc['mean', 'kor':'math']
dataFrame 7 - 파일 입출력
#excel 입 출력
import pandas as pd
import numpy as np
data = { 'kor':[10,30,70,70],
'eng':[20,40,80,60],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
df.index.name='이름'
df.to_excel('e:/aaa.xlsx')
df1 = pd.read_excel('e:/aaa.xlsx')
df1
bdf = pd.read_table(r'e:\births.txt', sep=',', header=None, index_col=0) #','를 기준으로 column을 나눔, 연도를 index로 보냄
bdf.columns=['남아', '여아']
bdf.index.name='년도'
bdf
#1. 남아수 총합을 구하시오
bdf['남아'].sum() #Series 멤버 함수
#2. 여아수 평균을 구하시오
bdf['여아'].mean()
#3. 남아수가 가장 많은 년도와 남아수를 구하시오
bdf[ bdf['남아'].max() == bdf['남아'] ].get('남아')
#4. 2000년도 이후 데이터를 구하시오
bdf.loc[ 2001: ]
#5. 1995~2000 년도 데이터를 구하시오
bdf.loc[ 1995:2000 ]
dataFrame 8 - 기타 dataFrame에 있는 멤버함수
dataFrame 8 - 기타 dataFrame에 있는 멤버함수
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter('ignore')
data = { 'kor':[10,30,70,70],
'eng':[20,40,80,60],
'math':[33,44,55,66]}
df = pd.DataFrame(data, index=['a','b','c','d'])
def fn(v):
print("v=",v)
return v.sum
#df.apply(fn)#각 column별 Series
#df.apply(fn, axis=1) #각 row별 Series
#apply 함수는 입력된 모든 각각의 데이터에 lambda식을 적용함?
print(df.apply(lambda v:v))
df.apply(lambda v:v.sum())
df.apply(lambda v:v[0])
df.apply(lambda v:v[1])
df['my']=df.apply(lambda v: '이상' if v[0]>=50 else '이하', axis=1)
df
# for n in df: #칼럼명
# print(n)
# for c,s in df.items():#튜플 0번째 칼럼명, 1번째 Series
# print(c,s[0],s[1],s[2])
# #print(c,'%(a)d %(b)d %(c)d %(d)d'%s)
# d={'aa':10, 'bb':20}
# print("%(aa)10d %(bb)d"%d)
for idx,s in df.iterrows():
print(idx,s[0],s[1],s[2])
#(lambda x : x+1)(1)
'''
6.남아출생이 가장많은 top5를 구하시오(년도와 남아수)
7. 남아율(%) 컬럼을 추가하고 각년도별 남아수가 차지하는 비율을 데이터로 보여주시오
8. 2000년도 이후 데이터에 대해 출생량 컴럼을 추가하고, 남아수가 1800000 이상이면 '많음' 아니면 '적음'이라고 보여주시오
-----> 남아수 출생량
2000 1233 '많음'
2001 1234 '적음'
9. 1800년대, 1900년대, 2000년대 각 남아, 여아수 평균을 구하시오
'''
bdf = pd.read_table(r'e:\births.txt', sep=',', header=None, index_col=0) #','를 기준으로 column을 나눔, 연도를 index로 보냄
bdf.columns=['남아', '여아']
bdf.index.name='년도'
bdf
#df.sort_values(by=['kor', 'eng'], ascending=[True, False]) #각 columns별 정렬 기준을 다르게 지정할 수 있음
#6.
bdf.sort_values(by=['남아'], ascending=False)[:5]['남아']#.head()['남아']
#7.
bdf['남아율'] = bdf['남아']/(bdf['남아']+bdf['여아'])
bdf
#8.
b2000 = bdf.loc[2000:]
#df['my']=df.apply(lambda v: '이상' if v[0]>=50 else '이하', axis=1)
b2000['출생량'] = b2000.apply(lambda v: '많음' if v[0]>1800000 else '적음', axis=1)
b2000
#9.
m1800 = bdf.loc[1800:1899, '남아'].mean()
f1800 = bdf.loc[1800:1899, '여아'].mean()
_1800 = bdf.loc[1800:1899].mean() #모든 column에 대하여 연산하기에 힌번에 해도 됨
m1900 = bdf.loc[1900:1999, '남아'].mean()
f1900 = bdf.loc[1900:1999, '여아'].mean()
m2000 = bdf.loc[2000:, '남아'].mean()
f2000 = bdf.loc[2000:, '여아'].mean()
#print(m1800, f1800, '\n', m1900, f1900, '\n', m2000, f2000)
print(_1800)
dataFrame 10 - 멀티인덱스, 피봇테이블
import pandas as pd
import numpy as np
df = pd.read_excel(r'e:\hotel.xlsx', index_col='Unnamed: 0')
df
#호텔 등급별 가격의 합 구하고 싶음
g = df.groupby('grade') # 반환값 : DataFrameGroupBy의 멤버함수 들(sum, count, max, min, agg, mean)
g.sum() #
#정수 및 실수 컴럼 모두 집계대상....
g.sum()[['price']] #집계된 결과에서 'price' 칼럼만 보고 싶다면
g.mean()
#g.count()
g.max()['price']
g.agg(['sum', 'count', 'mean']) #각 column에 대한 결과를 multicolumn으로 출력
grp = g.agg(['sum', 'count', 'mean'])['price'] #모든 멤버함수를 한번에 적용
grp.columns=['가격합계', '갯수', '가격평균'] #칼럼 이름 바꾸기
grp.index.name="호텔등급"
grp.rename(columns={'갯수':'등급갯수'}, inplace=True) # 특정 column 이름만 바꾸고 싶을 때, dictionary를 사용
grp.rename(index={5:'5등급'}, inplace=True)
grp
df.reset_index(inplace=True) #index를 수정하였던 것을 되돌린다
df.rename(columns={'index': 'hotelname'}, inplace=True)
df
#피봇, 멀티인덱스
df1 = df.pivot_table(index=['grade', 'hotelname'], values=['rate', 'price'])
#멀티인덱스 접근 : 인덱스 가고, 또 그다음 인덱스 접근하면 된다.
g5 = df1.loc[5]
g5.loc[['호텔14']]
df1.loc[5].loc['호텔15']
df1
dataFrame 11 - 서로 다른 두 DataFrame간 Merge하기
#서로 다른 두 DataFrame간 merge하기
import pandas as pd
import numpy as np
employee = [{'empno':1, 'ename':'kim', 'dept':1},
{'empno':2, 'ename':'lee', 'dept':2},
{'empno':3, 'ename':'park', 'dept':1},
{'empno':4, 'ename':'song', 'dept':3},
{'empno':5, 'ename':'min', 'dept':2}
]
dept=[{'dept':1, 'deptname':'관리직'},
{'dept':2, 'deptname':'영업직'},
{'dept':3, 'deptname':'개발직'}
]
info =[{'empno':1, 'addr':'서울시','phone':'010-1111-1111'},
{'empno':3, 'addr':'부산시','phone':'010-2222-2222'},
{'empno':2, 'addr':'광주시','phone':'010-3333-3333'},
{'empno':5, 'addr':'광주시','phone':'010-4444-4444'},
{'empno':4, 'addr':'광주시','phone':'010-5555-5555'}
]
emp = pd.DataFrame(employee)
dept = pd.DataFrame(dept)
info = pd.DataFrame(info)
info
m = pd.merge(emp, dept, on='dept') #merge를 하는데, 'dept' 칼럼을 기준으로 해라는 뜻
m.drop(columns=['dept'], inplace=True) #merge 후 'dept'칼럼 필요없어짐
m
femp = pd.merge(m, info, on='empno') #'on'은 merge할 기준 칼럼
femp.drop(columns=['empno'], inplace=True)
femp
#
#pd.concat([emp, dept]) #없는 칼럼에 대한 정보는 NaN으로 채워짐
#pd.concat([emp, dept], axis=1) #없는 칼럼에 대한 정보는 NaN으로 채워짐
pd.concat([emp, dept], axis=1, join='inner') #NaN있는 부분 제거
dataFrame 12 - #multi_index 관련
#multi_index 관련
import pandas as pd
import numpy as np
#30 <= n < 100, random 8
data1 = np.random.randint(30,100,size=6)
data2 = np.random.randint(30,100,size=6)
data3 = np.random.randint(30,100,size=6)
data4 = np.random.randint(30,100,size=6)
data = [ data1 , data2 , data3 , data4]
df.T #행과 열이 바뀜
df = pd.DataFrame(data)
#df.index = [[2017, 2017, 2018, 2018], ['1반', '2반', '1반', '2반']] #multi_index 만들기
#df.index = [[2017, 2017, 2018, 2018]]
#df.loc[2017]
#(2017 - 1반, 2017 - 2반, 2018 - 1반, 2018 - 2반)
df.index = pd.MultiIndex.from_product([[2017,2018],['1반','2반']], names=['년도', '반']) #multi_index 만들기,
# df.columns = [['문과','문과','이과','이과', '인문', '인문'], # multi_columns 만들기
# ['국어', '영어', '수학', '과학', '사회', '도덕']]
df.columns = [['홍길동','홍길동','이순신','이순신', '임꺽정', '임꺽정'], # multi_columns 만들기
['국어', '영어', '수학', '과학', '사회', '도덕']]
df.columns = pd.MultiIndex.from_product([['홍길동', '이순신', '임꺽정'], ['국어', '영어']])
df