[Python]Pandas(판다스)란?

정호석·2022년 8월 5일
0

Pandas(판다스)란? - 파이썬 라이브러리

pandas파이썬에서 사용하는 데이터 분석 라이브러리 입니다.
pandas를 사용하면 행과 열로 이루어진 데이터 객체를 만들어 다룰 수 있게 되며
보다 안정적으로 대용량의 데이터들을 처리하는데 매우 편리한 라이브러리입니다.

Pandas를 이용한 예시들을 살펴보자

# pandas import 문
import pandas as pd
# numpy import 문
import numpy as np

1.Pandas 자료구조

Pandas에서는 기본적으로 정의되는 자료구조인 Series와 Data Frame을 사용합니다.

이 자료구조들은 빅 데이터 분석에 있어서 높은 수준의 성능을 보여줍니다.

====================================================================

1-1 Series

# 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

====================================================================

1-2 Data Frame

# 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

2-1 DataFrame에서 열을 선택하고 조작하기

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

2-2 DataFrame에서 행을 선택하고 조작하기

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'

3. DataFrame에서의 boolean Indexing

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

4. Data

# 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 없애기

# 행의 값중 하나라도 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

5. Data 분석용 함수들

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

Pandas에서 DataFrame에 적용되는 함수들

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
profile
welcome

0개의 댓글