pandas는 파이썬에서 사용하는 데이터 분석 라이브러리 입니다.
pandas를 사용하면 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며
보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 라이브러리입니다.
Pandas를 이용한 예시들을 살펴보자
# pandas import 문
import pandas as pd
# numpy import 문
import numpy as np
Pandas에서는 기본적으로 정의되는 자료구조인 Series와 Data Frame을 사용합니다.
이 자료구조들은 빅 데이터 분석에 있어서 높은 수준의 성능을 보여줍니다.
====================================================================
# Series 정의하기
obj = pd.Series([1, 3, 5, -7])
# obj 출력
obj
0 1 1 3 2 5 3 -7 dtype: int64
# Series의 값만 확인하기
obj.values
array([ 1, 3, 5, -7])
# Series의 인덱스만 확인하기
obj.index
RangeIndex(start=0, stop=4, step=1)
# Series의 자료형 확인하기
obj.dtypes
dtype('int64')
# 인덱스값 변경하기 - default는 0 1 2 3 ...
obj2 = pd.Series([9,8,7,6], index=['a','b','c','d'])
obj2
a 9 b 8 c 7 d 6 dtype: int64
# dictionart형 배열을 Series data로 만들어보기
# 자동으로 key값이 index가 됩니다
dic_data = {'jeong':10, 'kim':20,'choi':30,'lee':40}
obj3 = pd.Series(dic_data)
obj3
jeong 10 kim 20 choi 30 lee 40 dtype: int64
# 위의 obj3 의 index 값 변경
obj3.index = ['J','K','C','L']
obj3
J 10 K 20 C 30 L 40 dtype: int64
# 데이터 객체의 이름을 변경
obj3.name = 'myData'
# 인덱스 항목명 부여하기
obj3.index.name = "Name"
# value 항목명 부여하기
obj3
Name J 10 K 20 C 30 L 40 Name: myData, dtype: int64
====================================================================
# Data Frame 정의하기
data = {'name':['Jeong','Lee','Choi','Kim','Hong'],
'age':[21, 22, 23, 24, 25 ],
'stamp':[11.0, 12.0, 13.5, 14.5, 15]
}
df = pd.DataFrame(data)
# Data Frame을 사용하면 가독성이 좋은 행과 열의 구조를 가진 데이터로 변형됩니다.
df
name age stamp 0 Jeong 21 11.0 1 Lee 22 12.0 2 Choi 23 13.5 3 Kim 24 14.5 4 Hong 25 15.0
# 행 방향의 index
df.index
RangeIndex(start=0, stop=5, step=1)
# 열 방향의 index
df.columns
Index(['name', 'age', 'stamp'], dtype='object')
# DataFrame의 값만 출력
df.values
array([['Jeong', 21, 11.0], ['Lee', 22, 12.0], ['Choi', 23, 13.5], ['Kim', 24, 14.5], ['Hong', 25, 15.0]], dtype=object)
# 인덱스에 항목명 부여하기
df.index.name = 'No.'
df.columns.name = 'Info'
df
Info name age stamp No. 0 Jeong 21 11.0 1 Lee 22 12.0 2 Choi 23 13.5 3 Kim 24 14.5 4 Hong 25 15.0
# DataFrame을 만들때 columns와 index를 설정 할 수 있습니다.
df2 = pd.DataFrame(data, columns=['age', 'stamp', 'name', 'class'],
index=['one', 'two', 'three', 'four', 'five'])
df2
age stamp name class one 21 11.0 Jeong NaN two 22 12.0 Lee NaN three 23 13.5 Choi NaN four 24 14.5 Kim NaN five 25 15.0 Hong NaN
DataFrame을 정의하면서, data로 들어가는 dictionary와 columns의 순서를 바꿔도 스스로 맞춰서 정의됩니다.
# describe() 함수는 DataFrame의 계산 가능한 값들에 대한 다양한 계산 값을 보여줍니다.
df2.describe()
age stamp count 5.000000 5.000000 mean 23.000000 13.200000 std 1.581139 1.680774 min 21.000000 11.000000 25% 22.000000 12.000000 50% 23.000000 13.500000 75% 24.000000 14.500000 max 25.000000 15.000000
data = {"names": ["jeong", "jeong", "jeong", "Kim", "Kim"],
"year": [2014, 2015, 2016, 2015, 2016],
"points": [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data, columns=["year", "names", "points", "penalty"],
index=["one", "two", "three", "four", "five"])
df
year names points penalty one 2014 jeong 1.5 NaN two 2015 jeong 1.7 NaN three 2016 jeong 3.6 NaN four 2015 Kim 2.4 NaN five 2016 Kim 2.9 NaN
df['year']
one 2014 two 2015 three 2016 four 2015 five 2016 Name: year, dtype: int64
# 위와 동일한 명령어
df.year
one 2014 two 2015 three 2016 four 2015 five 2016 Name: year, dtype: int64
df[['year','points']]
year points one 2014 1.5 two 2015 1.7 three 2016 3.6 four 2015 2.4 five 2016 2.9
# 특정 열에 대해 위와 같이 선택하고, 우리가 원하는 값을 대입 할 수 있다.
df['penalty'] = 0.5
df
year names points penalty one 2014 jeong 1.5 0.5 two 2015 jeong 1.7 0.5 three 2016 jeong 3.6 0.5 four 2015 Kim 2.4 0.5 five 2016 Kim 2.9 0.5
# or
df['penalty'] = [0.1, 0.2, 0.3, 0.4, 0.5]
# python의 LIST 나 numpy의 array
df
year names points penalty one 2014 jeong 1.5 0.1 two 2015 jeong 1.7 0.2 three 2016 jeong 3.6 0.3 four 2015 Kim 2.4 0.4 five 2016 Kim 2.9 0.5
# 새로운 열 추가하기
df['zeros'] = np.arange(5)
df
year names points penalty zeros one 2014 jeong 1.5 0.1 0 two 2015 jeong 1.7 0.2 1 three 2016 jeong 3.6 0.3 2 four 2015 Kim 2.4 0.4 3 five 2016 Kim 2.9 0.5 4
# Series를 추가할 수도 있다.
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df['debt'] = val
df
year names points penalty zeros debt one 2014 jeong 1.5 0.1 0 NaN two 2015 jeong 1.7 0.2 1 -1.2 three 2016 jeong 3.6 0.3 2 NaN four 2015 Kim 2.4 0.4 3 -1.5 five 2016 Kim 2.9 0.5 4 -1.7
df['net_points'] = df['points'] = df['penalty']
df['high_points'] = df['net_points'] > 2.0
df
year names points penalty zeros debt net_points high_points one 2014 jeong 0.1 0.1 0 NaN 0.1 False two 2015 jeong 0.2 0.2 1 -1.2 0.2 False three 2016 jeong 0.3 0.3 2 NaN 0.3 False four 2015 Kim 0.4 0.4 3 -1.5 0.4 False five 2016 Kim 0.5 0.5 4 -1.7 0.5 False
df.columns
Index(['year', 'names', 'points', 'penalty', 'zeros', 'debt', 'net_points', 'high_points'], dtype='object')
df.index.name = 'Order'
df.columns.name = 'Info'
df
Info year names points penalty zeros debt net_points high_points Order one 2014 jeong 0.1 0.1 0 NaN 0.1 False two 2015 jeong 0.2 0.2 1 -1.2 0.2 False three 2016 jeong 0.3 0.3 2 NaN 0.3 False four 2015 Kim 0.4 0.4 3 -1.5 0.4 False five 2016 Kim 0.5 0.5 4 -1.7 0.5 False
Pandas 에서는 DataFrame 에서 행을 인덱싱하는 방법이 무수히 많다
물론 위에서 소개했던 열을 선택하는 방법도 수많은 방법중에 하나에 불과하다.
# 0번째 부터 2(3-1) 번째까지 가져온다.
# 뒤에 써준 숫자번째 행은 뺀다.
df[0:3]
Info year names points penalty zeros debt net_points high_points Order one 2014 jeong 0.1 0.1 0 NaN 0.1 False two 2015 jeong 0.2 0.2 1 -1.2 0.2 False three 2016 jeong 0.3 0.3 2 NaN 0.3 False
# two 행부터 four 행까지 가져오기.
# 뒤에 써준 이름의 행은 빼지 않는다.
df['two':'four']
Info year names points penalty zeros debt net_points high_points Order two 2015 jeong 0.2 0.2 1 -1.2 0.2 False three 2016 jeong 0.3 0.3 2 NaN 0.3 False four 2015 Kim 0.4 0.4 3 -1.5 0.4 False
# 권장하는 방법
# .loc 혹은 .iloc함수를 사용하는 방법
df.loc['two'] # 반환 형태는 Series
Info year 2015 names jeong points 0.2 penalty 0.2 zeros 1 debt -1.2 net_points 0.2 high_points False Name: two, dtype: object
df.loc['two':'four']
Info year names points penalty zeros debt net_points high_points Order two 2015 jeong 0.2 0.2 1 -1.2 0.2 False three 2016 jeong 0.3 0.3 2 NaN 0.3 False four 2015 Kim 0.4 0.4 3 -1.5 0.4 False
df.loc['two':'four','points']
Order two 0.2 three 0.3 four 0.4 Name: points, dtype: float64
df.loc[:,'year'] # == df['year']
Order one 2014 two 2015 three 2016 four 2015 five 2016 Name: year, dtype: int64
df.loc[:,['year','names']]
Info year names Order one 2014 jeong two 2015 jeong three 2016 jeong four 2015 Kim five 2016 Kim
df.loc['three':'five','year':'penalty']
Info year names points penalty Order three 2016 jeong 0.3 0.3 four 2015 Kim 0.4 0.4 five 2016 Kim 0.5 0.5
# 열 삭제하기
del df['high_points']
del df['net_points']
del df['zeros']
df
Info year names points penalty debt Order one 2014 jeong 0.1 0.1 NaN two 2015 jeong 0.2 0.2 -1.2 three 2016 jeong 0.3 0.3 NaN four 2015 Kim 0.4 0.4 -1.5 five 2016 Kim 0.5 0.5 -1.7
# 새로운 행 삽입하기
df.loc['six',:] = [2013,'Jun',4.0,0.1,2.1]
df
Info year names points penalty debt Order one 2014.0 jeong 0.1 0.1 NaN two 2015.0 jeong 0.2 0.2 -1.2 three 2016.0 jeong 0.3 0.3 NaN four 2015.0 Kim 0.4 0.4 -1.5 five 2016.0 Kim 0.5 0.5 -1.7 six 2013.0 Jun 4.0 0.1 2.1
# .iloc 사용 : index 번호를 사용한다.
df.iloc[3] # 3번째 행을 가져온다.
Info year 2015.0 names Kim points 0.4 penalty 0.4 debt -1.5 Name: four, dtype: object
df.iloc[3:5, 0:2]
Info year names Order four 2015.0 Kim five 2016.0 Kim
df.iloc[[0,1,3], [1,2]]
Info names points Order one jeong 0.1 two jeong 0.2 four Kim 0.4
df.iloc[:,1:4]
Info names points penalty Order one jeong 0.1 0.1 two jeong 0.2 0.2 three jeong 0.3 0.3 four Kim 0.4 0.4 five Kim 0.5 0.5 six Jun 4.0 0.1
df.iloc[1,1]
'jeong'
df
Info year names points penalty debt Order one 2014.0 jeong 0.1 0.1 NaN two 2015.0 jeong 0.2 0.2 -1.2 three 2016.0 jeong 0.3 0.3 NaN four 2015.0 Kim 0.4 0.4 -1.5 five 2016.0 Kim 0.5 0.5 -1.7 six 2013.0 Jun 4.0 0.1 2.1
# year가 2014보다 큰 boolean data
df['year'] > 2014
Order one False two True three True four True five True six False Name: year, dtype: bool
df.loc[df['year']>2014,:]
Info year names points penalty debt Order two 2015.0 jeong 0.2 0.2 -1.2 three 2016.0 jeong 0.3 0.3 NaN four 2015.0 Kim 0.4 0.4 -1.5 five 2016.0 Kim 0.5 0.5 -1.7
df.loc[df['names'] == 'jeong',['names','points']]
Info names points Order one jeong 0.1 two jeong 0.2 three jeong 0.3
# numpy에서와 같이 논리연산을 응용할 수 있다.
df.loc[(df['points']>0.1)&(df['points']<0.4),:]
Info year names points penalty debt Order two 2015.0 jeong 0.2 0.2 -1.2 three 2016.0 jeong 0.3 0.3 NaN
# 새로운 값을 대입할 수도 있다.
df.loc[df['points'] > 0.4, 'penalty'] = 0
df
Info year names points penalty debt Order one 2014.0 jeong 0.1 0.1 NaN two 2015.0 jeong 0.2 0.2 -1.2 three 2016.0 jeong 0.3 0.3 NaN four 2015.0 Kim 0.4 0.4 -1.5 five 2016.0 Kim 0.5 0.0 -1.7 six 2013.0 Jun 4.0 0.0 2.1
# DataFrame을 만들때 index, column을 설정하지 않으면 기본값으로 0부터 시작하는 정수형 숫자로 입력된다.
df = pd.DataFrame(np.random.randn(6,4))
df
0 1 2 3 0 0.813152 -0.884624 -0.073768 -1.646888 1 -0.658504 1.200100 -0.489842 -0.542335 2 -1.281425 -1.067359 -1.468996 -0.416606 3 1.402798 0.374144 -1.057787 -2.302475 4 0.079202 -0.825610 0.477921 1.087320 5 -0.845713 0.208078 -0.929631 -0.891308
df.columns = ['A', 'B', 'C', 'D']
df.index = pd.date_range('20160701', periods=6)
#pandas에서 제공하는 date range함수는 datetime 자료형으로 구성된, 날짜 시각등을 알 수 있는 자료형을 만드는 함수
df.index
DatetimeIndex(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04', '2016-07-05', '2016-07-06'], dtype='datetime64[ns]', freq='D')
df
A B C D 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 2016-07-05 0.079202 -0.825610 0.477921 1.087320 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308
# np.nan은 NaN값을 의미한다.
df['F'] = [1.0, np.nan, 3.5, 6.1, np.nan, 7.0]
df
A B C D F 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 1.0 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 NaN 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 6.1 2016-07-05 0.079202 -0.825610 0.477921 1.087320 NaN 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
# 행의 값중 하나라도 nan인 경우 그 행을 없앤다.
df.dropna(how='any')
A B C D F 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 1.0 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 6.1 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
# 행의 값의 모든 값이 nan인 경우 그 행으 없앤다.
df.dropna(how='all')
A B C D F 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 1.0 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 NaN 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 6.1 2016-07-05 0.079202 -0.825610 0.477921 1.087320 NaN 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
drop함수는 특정 행 또는 열을 drop 하고 난 DataFrame을 반환한다.
즉, 반환을 받지 않으면 기존의 DataFrame은 그대로이다.
아니면, inplace=True라는 인자를 추가하여, 반환을 받지 않고서도
기존의 DataFrame이 변경되도록 한다.
# nan값에 값 넣기
df.fillna(value=0.5)
A B C D F 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 1.0 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 0.5 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 6.1 2016-07-05 0.079202 -0.825610 0.477921 1.087320 0.5 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
# nan값인지 확인하기
df.isnull()
A B C D F 2016-07-01 False False False False False 2016-07-02 False False False False True 2016-07-03 False False False False False 2016-07-04 False False False False False 2016-07-05 False False False False True 2016-07-06 False False False False False
# F열에서 nan값을 포함하는 행만 추출하기
df.loc[df.isnull()['F'],:]
A B C D F 2016-07-02 -0.658504 1.20010 -0.489842 -0.542335 NaN 2016-07-05 0.079202 -0.82561 0.477921 1.087320 NaN
pd.to_datetime('20160701')
Timestamp('2016-07-01 00:00:00')
# 특정 행 drop하기
df.drop(pd.to_datetime('20160701'))
A B C D F 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 NaN 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 6.1 2016-07-05 0.079202 -0.825610 0.477921 1.087320 NaN 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
# 2개 이상도 가능
df.drop([pd.to_datetime('20160702'),pd.to_datetime('20160704')])
A B C D F 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 1.0 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 3.5 2016-07-05 0.079202 -0.825610 0.477921 1.087320 NaN 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308 7.0
# 특정 열 삭제하기
df.drop('F', axis = 1)
A B C D 2016-07-01 0.813152 -0.884624 -0.073768 -1.646888 2016-07-02 -0.658504 1.200100 -0.489842 -0.542335 2016-07-03 -1.281425 -1.067359 -1.468996 -0.416606 2016-07-04 1.402798 0.374144 -1.057787 -2.302475 2016-07-05 0.079202 -0.825610 0.477921 1.087320 2016-07-06 -0.845713 0.208078 -0.929631 -0.891308
# 2개 이상의 열도 가능
df.drop(['B','D'], axis = 1)
A C F 2016-07-01 0.813152 -0.073768 1.0 2016-07-02 -0.658504 -0.489842 NaN 2016-07-03 -1.281425 -1.468996 3.5 2016-07-04 1.402798 -1.057787 6.1 2016-07-05 0.079202 0.477921 NaN 2016-07-06 -0.845713 -0.929631 7.0
data = [[1.4, np.nan],
[7.1, -4.5],
[np.nan, np.nan],
[0.75, -1.3]]
df = pd.DataFrame(data, columns=["one", "two"], index=["a", "b", "c", "d"])
df
one two a 1.40 NaN b 7.10 -4.5 c NaN NaN d 0.75 -1.3
# 행방향으로의 합(즉, 각 열의 합)
df.sum(axis=0)
one 9.25 two -5.80 dtype: float64
# 열방향으로의 합(즉, 각 행의 합)
df.sum(axis=1)
a 1.40 b 2.60 c 0.00 d -0.55 dtype: float64
이때, 위에서 볼 수 있듯이 NaN 값은 배제하고 계산이 이루어집니다.
NaN 값을 배제하지 않고 계산하려면 아래와 같이 skipna에 대해 false를 지정해준다
df.sum(axis=1, skipna=False)
a NaN b 2.60 c NaN d -0.55 dtype: float64
# 특정 행 또는 특정 열에서만 계산하기
df['one'].sum()
9.25
df.loc['b'].sum()
2.5999999999999996
sum() 함수 이외에도 pandas에서 DataFrame에 적용되는 함수는 다음의 것들이 있다.
count - 전체 성분의(NaN이 아닌)값의 갯수를 계산
min // max - 전체 성본의 최소, 최댓값을 계산
argmin // argmax - 전체 성분의 최솟값, 최댓값이 위치한 (정수)인덱스를 반환
idxmin // idxmax - 전체 인덱스 중 최솟값, 최댓값을 반환
quantile - 전체 성분의 특정 사분위수에 해당하는 값을 반환
sum - 전체 성분의 합을 계산
mean - 전체 성분의 평균을 계산
median - 전체 성분의 중간값을 반환
mad - 전체 성분의 평균값으로부터의 절대 편차(absolute deviation)의 평균을 계산
std // var - 전체 성분의 표준편차, 분산을 계산
cumsum - 맨 첫 번째 성분부터 각 성분까지의 누적합을 계산(0에서부터 계속 더해짐)
cumprod - 맨 첫 번째 성분부터 각 성분까지의 누적곱을 계산 (1에서부터 계속 곱해짐)
df2 = pd.DataFrame(np.random.randn(6, 4),
columns=["A", "B", "C", "D"],
index=pd.date_range("20160701", periods=6))
df2
A B C D 2016-07-01 1.903099 -0.146792 1.174776 -0.312124 2016-07-02 0.738378 0.876769 -1.010815 0.856980 2016-07-03 0.615368 -0.085528 -1.240643 0.043215 2016-07-04 -0.732926 -0.258130 0.574958 -0.073109 2016-07-05 -0.416194 -0.446480 -0.771587 0.794481 2016-07-06 -0.322933 -0.980334 0.561498 -1.338921
# A열과 B열의 상관계수 구하기
df2['A'].corr(df2['B'])
0.4411349926220052
# B열과 C열의 공분산 구하기
df2['B'].cov(df2['C'])
-0.28608001511594805
dates = df2.index
random_dates = np.random.permutation(dates)
df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
df2
D B C A 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 2016-07-02 0.856980 0.876769 -1.010815 0.738378 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926
# index와 column의 순서가 섞여있다.
# 이때 index가 오름차순이 되도록 정렬해보자
df2.sort_index(axis=0)
D B C A 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 2016-07-02 0.856980 0.876769 -1.010815 0.738378 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933
# column을 기준으로?
df2.sort_index(axis=1)
A B C D 2016-07-05 -0.416194 -0.446480 -0.771587 0.794481 2016-07-01 1.903099 -0.146792 1.174776 -0.312124 2016-07-02 0.738378 0.876769 -1.010815 0.856980 2016-07-03 0.615368 -0.085528 -1.240643 0.043215 2016-07-06 -0.322933 -0.980334 0.561498 -1.338921 2016-07-04 -0.732926 -0.258130 0.574958 -0.073109
# 내림차순으로는?
df2.sort_index(axis=1, ascending=False)
D C B A 2016-07-05 0.794481 -0.771587 -0.446480 -0.416194 2016-07-01 -0.312124 1.174776 -0.146792 1.903099 2016-07-02 0.856980 -1.010815 0.876769 0.738378 2016-07-03 0.043215 -1.240643 -0.085528 0.615368 2016-07-06 -1.338921 0.561498 -0.980334 -0.322933 2016-07-04 -0.073109 0.574958 -0.258130 -0.732926
# 값 기준 정렬하기
# D열의 값이 오름차순이 되도록 정렬하기
df2.sort_values(by='D')
D B C A 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 2016-07-02 0.856980 0.876769 -1.010815 0.738378
# B열의 값이 내림차순이 되도록 정렬하기
df2.sort_values(by='B', ascending=False)
D B C A 2016-07-02 0.856980 0.876769 -1.010815 0.738378 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933
df2["E"] = np.random.randint(0, 6, size=6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
df2
D B C A E F 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 4 alpha 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 1 beta 2016-07-02 0.856980 0.876769 -1.010815 0.738378 5 gamma 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 0 gamma 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933 0 alpha 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926 3 gamma
# E열과 F열을 동시에 고려하여, 오름차순으로 하려면?
df2.sort_values(by=['E','F'])
D B C A E F 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933 0 alpha 2016-07-03 0.043215 -0.085528 -1.240643 0.615368 0 gamma 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 1 beta 2016-07-04 -0.073109 -0.258130 0.574958 -0.732926 3 gamma 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 4 alpha 2016-07-02 0.856980 0.876769 -1.010815 0.738378 5 gamma
# 지정한 행 또는 열에서 중복값을 제외한 유니크한 값만 얻기
df2['F'].unique()
array(['alpha', 'beta', 'gamma'], dtype=object)
# 지정한 행 또는 열에서 값에 따른 개수 얻기
df2['F'].value_counts()
gamma 3 alpha 2 beta 1 Name: F, dtype: int64
# 지정한 행 또는 열에서 입력한 값이 있는지 확인하기
df2['F'].isin(['alpha','beta'])
# 아래와 같이 응용할 수 있다.
2016-07-05 True 2016-07-01 True 2016-07-02 False 2016-07-03 False 2016-07-06 True 2016-07-04 False Name: F, dtype: bool
# F열의 값이 alpha나 beta인 모든 행 구하기
df2.loc[df2['F'].isin(['alpha','beta']),:]
D B C A E F 2016-07-05 0.794481 -0.446480 -0.771587 -0.416194 4 alpha 2016-07-01 -0.312124 -0.146792 1.174776 1.903099 1 beta 2016-07-06 -1.338921 -0.980334 0.561498 -0.322933 0 alpha
df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"], index=["Seoul", "Incheon", "Busan", "Daegu"])
df3
b d e Seoul 0.184033 -1.991396 -0.540313 Incheon 1.752387 0.048261 -0.466241 Busan -0.580463 0.182167 0.780224 Daegu -2.008698 0.429886 -1.591596
func = lambda x: x.max() - x.min()
df3.apply(func, axis=0)
b 3.761085 d 2.421282 e 2.371820 dtype: float64