티스토리 뷰

AI

[머신러닝] Pandas(판다스) 정리

감자형 2018. 8. 8. 00:55

안녕하세요. 감자 코딩에 감자개발자 입니다. 이번에 알아볼 것들은 Pandas Package입니다.



1. Pandas란?


데이터 분석, 데이터 처리 등을 쉽게 하기 위해 만들어진 python package 보다 안정적으로 대용량 데이터들을 쉽게 처리할 수 있음.



대표적인 Pandas 자료구조 2가지


2. Series란?


Series는 value와 index의 형태를 지니는 Pandas의 자료 구조이다.

아래 그림과 같이 [1,3,5,7]의 값을 가지는 리스트를 Series로 생성하게 되면 (1,3,5,7)이라는 value와 (0,1,2,3)이라는 index가

생성되어 Series라는 형태의 자료 구조를 만든다.


3. DataFrame이란?

DataFrame은 여러 개의 Dictionary를 처리하는데 있어 Series보다 보기 편한 형태로 제공해 줄 수 있는 자료 구조.

Ex) 엑셀의 표 모양 



4. 실습 해보기





 Series 정의하기
obj = pd.Series([4, 7, -5, 3])
obj
Out[3]:
0    4
1    7
2   -5
3    3
dtype: int64
In [4]:
# Series의 값만 확인하기
obj.values
Out[4]:
array([ 4,  7, -5,  3])
In [5]:
# Series의 인덱스만 확인하기
obj.index
Out[5]:
RangeIndex(start=0, stop=4, step=1)
In [7]:
# Series의 자료형 확인하기
obj.dtypes
Out[7]:
dtype('int64')
In [8]:
# 인덱스를 바꿀 수 있다.
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
Out[8]:
d    4
b    7
a   -5
c    3
dtype: int64
In [10]:
# python의 dictionary 자료형을 Series data로 만들 수 있다.
# dictionary의 key가 Series의 index가 된다
sdata = {'Kim': 35000, 'Beomwoo': 67000, 'Joan': 12000, 'Choi': 4000}
obj3 = pd.Series(sdata)
obj3
Out[10]:
Kim        35000
Beomwoo    67000
Joan       12000
Choi        4000
dtype: int64
In [12]:
obj3.name = 'Salary'
obj3.index.name = "Names"
obj3
Out[12]:
Names
Kim        35000
Beomwoo    67000
Joan       12000
Choi        4000
Name: Salary, dtype: int64
In [13]:
# index 변경
obj3.index = ['A', 'B', 'C', 'D']
obj3
Out[13]:
A    35000
B    67000
C    12000
D     4000
Name: Salary, dtype: int64

2-2. Data Frame

이번에는 Data Frame에 대해서 알아보도록 하겠습니다.

In [23]:
# Data Frame 정의하기
# 이전에 DataFrame에 들어갈 데이터를 정의해주어야 하는데,
# 이는 python의 dictionary 또는 numpy의 array로 정의할 수 있다.
data = {'name': ['Beomwoo', 'Beomwoo', 'Beomwoo', 'Kim', 'Park'],
        'year': [2013, 2014, 2015, 2016, 2015],
        'points': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
df
Out[23]:
nameyearpoints
0Beomwoo20131.5
1Beomwoo20141.7
2Beomwoo20153.6
3Kim20162.4
4Park20152.9
In [24]:
# 행과 열의 구조를 가진 데이터가 생긴다.
In [25]:
# 행 방향의 index
df.index
Out[25]:
RangeIndex(start=0, stop=5, step=1)
In [26]:
# 열 방향의 index
df.columns
Out[26]:
Index(['name', 'year', 'points'], dtype='object')
In [27]:
# 값 얻기
df.values
Out[27]:
array([['Beomwoo', 2013, 1.5],
       ['Beomwoo', 2014, 1.7],
       ['Beomwoo', 2015, 3.6],
       ['Kim', 2016, 2.4],
       ['Park', 2015, 2.9]], dtype=object)
In [28]:
# 각 인덱스에 대한 이름 설정하기
df.index.name = 'Num'
df.columns.name = 'Info'
df
Out[28]:
Infonameyearpoints
Num
0Beomwoo20131.5
1Beomwoo20141.7
2Beomwoo20153.6
3Kim20162.4
4Park20152.9
In [29]:
# DataFrame을 만들면서 columns와 index를 설정할 수 있다.
df2 = pd.DataFrame(data, columns=['year', 'name', 'points', 'penalty'],
                  index=['one', 'two', 'three', 'four', 'five'])
df2
Out[29]:
yearnamepointspenalty
one2013Beomwoo1.5NaN
two2014Beomwoo1.7NaN
three2015Beomwoo3.6NaN
four2016Kim2.4NaN
five2015Park2.9NaN

DataFrame을 정의하면서, data로 들어가는 python dictionary와 columns의 순서가 달라도 알아서 맞춰서 정의된다.

하지만 data에 포함되어 있지 않은 값은 NaN(Not a Number)으로 나타나게 되는데,

이는 null과 같은 개념이다.

NaN값은 추후에 어떠한 방법으로도 처리가 되지 않는 데이터이다.

따라서 올바른 데이터 처리를 위해 추가적으로 값을 넣어줘야 한다.

In [31]:
# describe() 함수는 DataFrame의 계산 가능한 값들에 대한 다양한 계산 값을 보여준다.
df2.describe()
Out[31]:
yearpoints
count5.0000005.000000
mean2014.6000002.420000
std1.1401750.864292
min2013.0000001.500000
25%2014.0000001.700000
50%2015.0000002.400000
75%2015.0000002.900000
max2016.0000003.600000

3. DataFrame Indexing

In [33]:
data = {"names": ["Kilho", "Kilho", "Kilho", "Charles", "Charles"],
           "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
Out[33]:
yearnamespointspenalty
one2014Kilho1.5NaN
two2015Kilho1.7NaN
three2016Kilho3.6NaN
four2015Charles2.4NaN
five2016Charles2.9NaN

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

In [34]:
df['year']
Out[34]:
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [36]:
# 동일한 의미를 갖는, 다른 방법
df.year
Out[36]:
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [37]:
df[['year','points']]
Out[37]:
yearpoints
one20141.5
two20151.7
three20163.6
four20152.4
five20162.9
In [38]:
# 특정 열에 대해 위와 같이 선택하고, 우리가 원하는 값을 대입할 수 있다.
df['penalty'] = 0.5
In [39]:
df
Out[39]:
yearnamespointspenalty
one2014Kilho1.50.5
two2015Kilho1.70.5
three2016Kilho3.60.5
four2015Charles2.40.5
five2016Charles2.90.5
In [42]:
# 또는
df['penalty'] = [0.1, 0.2, 0.3, 0.4, 0.5] # python의 List나 numpy의 array
In [43]:
df
Out[43]:
yearnamespointspenalty
one2014Kilho1.50.1
two2015Kilho1.70.2
three2016Kilho3.60.3
four2015Charles2.40.4
five2016Charles2.90.5
In [44]:
# 새로운 열을 추가하기
df['zeros'] = np.arange(5)
In [45]:
df
Out[45]:
yearnamespointspenaltyzeros
one2014Kilho1.50.10
two2015Kilho1.70.21
three2016Kilho3.60.32
four2015Charles2.40.43
five2016Charles2.90.54
In [49]:
# Series를 추가할 수도 있다.
val = pd.Series([-1.2, -1.5, -1.7], index=['two','four','five'])
In [50]:
df['debt'] = val
In [51]:
df
Out[51]:
yearnamespointspenaltyzerosdebt
one2014Kilho1.50.10NaN
two2015Kilho1.70.21-1.2
three2016Kilho3.60.32NaN
four2015Charles2.40.43-1.5
five2016Charles2.90.54-1.7

하지만 Series로 넣을 때는 val와 같이 넣으려는 data의 index에 맞춰서 데이터가 들어간다.

이점이 python list나 numpy array로 데이터를 넣을때와 가장 큰 차이점이다.

In [52]:
df['net_points'] = df['points'] - df['penalty']
In [53]:
df['high_points'] = df['net_points'] > 2.0
In [54]:
df
Out[54]:
yearnamespointspenaltyzerosdebtnet_pointshigh_points
one2014Kilho1.50.10NaN1.4False
two2015Kilho1.70.21-1.21.5False
three2016Kilho3.60.32NaN3.3True
four2015Charles2.40.43-1.52.0False
five2016Charles2.90.54-1.72.4True
In [55]:
# 열 삭제하기
del df['high_points']
In [56]:
del df['net_points']
del df['zeros']
In [57]:
df
Out[57]:
yearnamespointspenaltydebt
one2014Kilho1.50.1NaN
two2015Kilho1.70.2-1.2
three2016Kilho3.60.3NaN
four2015Charles2.40.4-1.5
five2016Charles2.90.5-1.7
In [58]:
df.columns
Out[58]:
Index(['year', 'names', 'points', 'penalty', 'debt'], dtype='object')
In [59]:
df.index.name = 'Order'
df.columns.name = 'Info'
In [60]:
df
Out[60]:
Infoyearnamespointspenaltydebt
Order
one2014Kilho1.50.1NaN
two2015Kilho1.70.2-1.2
three2016Kilho3.60.3NaN
four2015Charles2.40.4-1.5
five2016Charles2.90.5-1.7

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

pandas에서는 DataFrame에서 행을 인덱싱하는 방법이 무수히 많다.

물론 위에서 소개했던 열을 선택하는 방법도 수많은 방법중에 하나에 불과하다.

In [61]:
# 0번째 부터 2(3-1) 번째까지 가져온다.
# 뒤에 써준 숫자번째의 행은 뺀다.
df[0:3]
Out[61]:
Infoyearnamespointspenaltydebt
Order
one2014Kilho1.50.1NaN
two2015Kilho1.70.2-1.2
three2016Kilho3.60.3NaN
In [63]:
# tow라는 행부터 four라는 행까지 가져온다.
# 뒤에 써준 이름의 행을 빼지 않는다.
df['two':'four'] # 하지만 비추천!
Out[63]:
Infoyearnamespointspenaltydebt
Order
two2015Kilho1.70.2-1.2
three2016Kilho3.60.3NaN
four2015Charles2.40.4-1.5
In [65]:
# 아래 방법을 권장한다. 
# .loc 또는 .iloc 함수를 사용하는 방법.
df.loc['two'] # 반환 형태는 Series
Out[65]:
Info
year        2015
names      Kilho
points       1.7
penalty      0.2
debt        -1.2
Name: two, dtype: object
In [67]:
df.loc['two':'four']
Out[67]:
Infoyearnamespointspenaltydebt
Order
two2015Kilho1.70.2-1.2
three2016Kilho3.60.3NaN
four2015Charles2.40.4-1.5
In [69]:
df.loc['two':'four', 'points']
Out[69]:
Order
two      1.7
three    3.6
four     2.4
Name: points, dtype: float64
In [70]:
df.loc[:,'year'] # == df['year']
Out[70]:
Order
one      2014
two      2015
three    2016
four     2015
five     2016
Name: year, dtype: int64
In [71]:
df.loc[:,['year','names']]
Out[71]:
Infoyearnames
Order
one2014Kilho
two2015Kilho
three2016Kilho
four2015Charles
five2016Charles
In [72]:
df.loc['three':'five','year':'penalty']
Out[72]:
Infoyearnamespointspenalty
Order
three2016Kilho3.60.3
four2015Charles2.40.4
five2016Charles2.90.5
In [73]:
# 새로운 행 삽입하기
df.loc['six',:] = [2013,'Jun',4.0,0.1,2.1]
In [74]:
df
Out[74]:
Infoyearnamespointspenaltydebt
Order
one2014.0Kilho1.50.1NaN
two2015.0Kilho1.70.2-1.2
three2016.0Kilho3.60.3NaN
four2015.0Charles2.40.4-1.5
five2016.0Charles2.90.5-1.7
six2013.0Jun4.00.12.1
In [79]:
# .iloc 사용:: index 번호를 사용한다.
df.iloc[3] # 3번째 행을 가져온다.
Out[79]:
Info
year          2015
names      Charles
points         2.4
penalty        0.4
debt          -1.5
Name: four, dtype: object
In [80]:
df.iloc[3:5, 0:2]
Out[80]:
Infoyearnames
Order
four2015.0Charles
five2016.0Charles
In [81]:
df.iloc[[0,1,3], [1,2]]
Out[81]:
Infonamespoints
Order
oneKilho1.5
twoKilho1.7
fourCharles2.4
In [83]:
df.iloc[:,1:4]
Out[83]:
Infonamespointspenalty
Order
oneKilho1.50.1
twoKilho1.70.2
threeKilho3.60.3
fourCharles2.40.4
fiveCharles2.90.5
sixJun4.00.1
In [84]:
df.iloc[1,1]
Out[84]:
'Kilho'

4. DataFrame에서의 boolean Indexing

In [85]:
df
Out[85]:
Infoyearnamespointspenaltydebt
Order
one2014.0Kilho1.50.1NaN
two2015.0Kilho1.70.2-1.2
three2016.0Kilho3.60.3NaN
four2015.0Charles2.40.4-1.5
five2016.0Charles2.90.5-1.7
six2013.0Jun4.00.12.1
In [87]:
# year가 2014보다 큰 boolean data
df['year'] > 2014
Out[87]:
Order
one      False
two       True
three     True
four      True
five      True
six      False
Name: year, dtype: bool
In [89]:
# year가 2014보다 큰 모든 행의 값
df.loc[df['year']>2014,:]
Out[89]:
Infoyearnamespointspenaltydebt
Order
two2015.0Kilho1.70.2-1.2
three2016.0Kilho3.60.3NaN
four2015.0Charles2.40.4-1.5
five2016.0Charles2.90.5-1.7
In [90]:
df.loc[df['names'] == 'Kilho',['names','points']]
Out[90]:
Infonamespoints
Order
oneKilho1.5
twoKilho1.7
threeKilho3.6
In [92]:
# numpy에서와 같이 논리연산을 응용할 수 있다.
df.loc[(df['points']>2)&(df['points']<3),:]
Out[92]:
Infoyearnamespointspenaltydebt
Order
four2015.0Charles2.40.4-1.5
five2016.0Charles2.90.5-1.7
In [93]:
# 새로운 값을 대입할 수도 있다.
df.loc[df['points'] > 3, 'penalty'] = 0
In [94]:
df
Out[94]:
Infoyearnamespointspenaltydebt
Order
one2014.0Kilho1.50.1NaN
two2015.0Kilho1.70.2-1.2
three2016.0Kilho3.60.0NaN
four2015.0Charles2.40.4-1.5
five2016.0Charles2.90.5-1.7
six2013.0Jun4.00.02.1

5. Data

In [95]:
# DataFrame을 만들때 index, column을 설정하지 않으면 기본값으로 0부터 시작하는 정수형 숫자로 입력된다.
df = pd.DataFrame(np.random.randn(6,4))
df
Out[95]:
0123
00.682000-0.570393-1.602829-1.316469
1-1.1762030.1715270.3870181.027615
2-0.263178-0.2120491.0068560.096111
32.6793780.3471450.5481440.826258
4-0.2498770.018721-0.3937150.302361
50.851420-0.440360-0.3458951.055936
In [98]:
df.columns = ['A', 'B', 'C', 'D']
df.index = pd.date_range('20160701', periods=6)
#pandas에서 제공하는 date range함수는 datetime 자료형으로 구성된, 날짜 시각등을 알 수 있는 자료형을 만드는 함수
df.index
Out[98]:
DatetimeIndex(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04',
               '2016-07-05', '2016-07-06'],
              dtype='datetime64[ns]', freq='D')
In [99]:
df
Out[99]:
ABCD
2016-07-010.682000-0.570393-1.602829-1.316469
2016-07-02-1.1762030.1715270.3870181.027615
2016-07-03-0.263178-0.2120491.0068560.096111
2016-07-042.6793780.3471450.5481440.826258
2016-07-05-0.2498770.018721-0.3937150.302361
2016-07-060.851420-0.440360-0.3458951.055936
In [101]:
# np.nan은 NaN값을 의미한다.
df['F'] = [1.0, np.nan, 3.5, 6.1, np.nan, 7.0]
df
Out[101]:
ABCDF
2016-07-010.682000-0.570393-1.602829-1.3164691.0
2016-07-02-1.1762030.1715270.3870181.027615NaN
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-042.6793780.3471450.5481440.8262586.1
2016-07-05-0.2498770.018721-0.3937150.302361NaN
2016-07-060.851420-0.440360-0.3458951.0559367.0

NaN 없애기

In [102]:
# 행의 값중 하나라도 nan인 경우 그 행을 없앤다.
df.dropna(how='any') 
Out[102]:
ABCDF
2016-07-010.682000-0.570393-1.602829-1.3164691.0
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-042.6793780.3471450.5481440.8262586.1
2016-07-060.851420-0.440360-0.3458951.0559367.0
In [103]:
# 행의 값의 모든 값이 nan인 경우 그 행으 없앤다.
df.dropna(how='all')
Out[103]:
ABCDF
2016-07-010.682000-0.570393-1.602829-1.3164691.0
2016-07-02-1.1762030.1715270.3870181.027615NaN
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-042.6793780.3471450.5481440.8262586.1
2016-07-05-0.2498770.018721-0.3937150.302361NaN
2016-07-060.851420-0.440360-0.3458951.0559367.0

주의 drop함수는 특정 행 또는 열을 drop하고난 DataFrame을 반환한다.

즉, 반환을 받지 않으면 기존의 DataFrame은 그대로이다.

아니면, inplace=True라는 인자를 추가하여, 반환을 받지 않고서도

기존의 DataFrame이 변경되도록 한다.

In [104]:
# nan값에 값 넣기
df.fillna(value=0.5)
Out[104]:
ABCDF
2016-07-010.682000-0.570393-1.602829-1.3164691.0
2016-07-02-1.1762030.1715270.3870181.0276150.5
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-042.6793780.3471450.5481440.8262586.1
2016-07-05-0.2498770.018721-0.3937150.3023610.5
2016-07-060.851420-0.440360-0.3458951.0559367.0
In [107]:
# nan값인지 확인하기
df.isnull()
Out[107]:
ABCDF
2016-07-01FalseFalseFalseFalseFalse
2016-07-02FalseFalseFalseFalseTrue
2016-07-03FalseFalseFalseFalseFalse
2016-07-04FalseFalseFalseFalseFalse
2016-07-05FalseFalseFalseFalseTrue
2016-07-06FalseFalseFalseFalseFalse
In [109]:
# F열에서 nan값을 포함하는 행만 추출하기
df.loc[df.isnull()['F'],:]
Out[109]:
ABCDF
2016-07-02-1.1762030.1715270.3870181.027615NaN
2016-07-05-0.2498770.018721-0.3937150.302361NaN
In [110]:
pd.to_datetime('20160701')
Out[110]:
Timestamp('2016-07-01 00:00:00')
In [111]:
# 특정 행 drop하기
df.drop(pd.to_datetime('20160701'))
Out[111]:
ABCDF
2016-07-02-1.1762030.1715270.3870181.027615NaN
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-042.6793780.3471450.5481440.8262586.1
2016-07-05-0.2498770.018721-0.3937150.302361NaN
2016-07-060.851420-0.440360-0.3458951.0559367.0
In [112]:
# 2개 이상도 가능
df.drop([pd.to_datetime('20160702'),pd.to_datetime('20160704')])
Out[112]:
ABCDF
2016-07-010.682000-0.570393-1.602829-1.3164691.0
2016-07-03-0.263178-0.2120491.0068560.0961113.5
2016-07-05-0.2498770.018721-0.3937150.302361NaN
2016-07-060.851420-0.440360-0.3458951.0559367.0
In [113]:
# 특정 열 삭제하기
df.drop('F', axis = 1)
Out[113]:
ABCD
2016-07-010.682000-0.570393-1.602829-1.316469
2016-07-02-1.1762030.1715270.3870181.027615
2016-07-03-0.263178-0.2120491.0068560.096111
2016-07-042.6793780.3471450.5481440.826258
2016-07-05-0.2498770.018721-0.3937150.302361
2016-07-060.851420-0.440360-0.3458951.055936
In [114]:
# 2개 이상의 열도 가능
df.drop(['B','D'], axis = 1)
Out[114]:
ACF
2016-07-010.682000-1.6028291.0
2016-07-02-1.1762030.387018NaN
2016-07-03-0.2631781.0068563.5
2016-07-042.6793780.5481446.1
2016-07-05-0.249877-0.393715NaN
2016-07-060.851420-0.3458957.0

6. Data 분석용 함수들

In [115]:
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"])
In [116]:
df
Out[116]:
onetwo
a1.40NaN
b7.10-4.5
cNaNNaN
d0.75-1.3
In [118]:
# 행방향으로의 합(즉, 각 열의 합)
df.sum(axis=0)
Out[118]:
one    9.25
two   -5.80
dtype: float64
In [119]:
# 열방향으로의 합(즉, 각 행의 합)
df.sum(axis=1)
Out[119]:
a    1.40
b    2.60
c    0.00
d   -0.55
dtype: float64

이때, 위에서 볼 수 있듯이 NaN값은 배제하고 계산한다.

NaN 값을 배제하지 않고 계산하려면 아래와 같이 skipna에 대해 false를 지정해준다.

In [123]:
df.sum(axis=1, skipna=False)
Out[123]:
a     NaN
b    2.60
c     NaN
d   -0.55
dtype: float64
In [120]:
# 특정 행 또는 특정 열에서만 계산하기
df['one'].sum()
Out[120]:
9.25
In [121]:
df.loc['b'].sum()
Out[121]:
2.5999999999999996

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

sum() 함수 이외에도 pandas에서 DataFrame에 적용되는 함수는 다음의 것들이 있다.

count 전체 성분의 (NaN이 아닌) 값의 갯수를 계산

min, max 전체 성분의 최솟, 최댓값을 계산

argmin, argmax 전체 성분의 최솟값, 최댓값이 위치한 (정수)인덱스를 반환

idxmin, idxmax 전체 인덱스 중 최솟값, 최댓값을 반환

quantile 전체 성분의 특정 사분위수에 해당하는 값을 반환 (0~1 사이)

sum 전체 성분의 합을 계산

mean 전체 성분의 평균을 계산

median 전체 성분의 중간값을 반환

mad 전체 성분의 평균값으로부터의 절대 편차(absolute deviation)의 평균을 계산

std, var 전체 성분의 표준편차, 분산을 계산

cumsum 맨 첫 번째 성분부터 각 성분까지의 누적합을 계산 (0에서부터 계속 더해짐)

cumprod 맨 첫번째 성분부터 각 성분까지의 누적곱을 계산 (1에서부터 계속 곱해짐)

In [125]:
df2 = pd.DataFrame(np.random.randn(6, 4),
                   columns=["A", "B", "C", "D"],
                   index=pd.date_range("20160701", periods=6))
df2
Out[125]:
ABCD
2016-07-011.0243590.2131590.277114-0.304599
2016-07-02-1.6939340.619885-1.6206760.067814
2016-07-03-0.2164220.6595570.342833-0.141637
2016-07-04-0.8734920.669932-0.5159440.280424
2016-07-05-0.923094-1.1746522.678657-0.663322
2016-07-06-1.5805760.539906-1.900090-0.428551
In [127]:
# A열과 B열의 상관계수 구하기
df2['A'].corr(df2['B'])
Out[127]:
-0.06715327766901227
In [128]:
# B열과 C열의 공분산 구하기
df2['B'].cov(df2['C'])
Out[128]:
-1.0099019967454226

정렬함수 및 기타함수

In [130]:
dates = df2.index
random_dates = np.random.permutation(dates)
df2 = df2.reindex(index=random_dates, columns=["D", "B", "C", "A"])
df2
Out[130]:
DBCA
2016-07-020.0678140.619885-1.620676-1.693934
2016-07-06-0.4285510.539906-1.900090-1.580576
2016-07-03-0.1416370.6595570.342833-0.216422
2016-07-01-0.3045990.2131590.2771141.024359
2016-07-05-0.663322-1.1746522.678657-0.923094
2016-07-040.2804240.669932-0.515944-0.873492
In [131]:
# index와 column의 순서가 섞여있다.
# 이때 index가 오름차순이 되도록 정렬해보자
df2.sort_index(axis=0)
Out[131]:
DBCA
2016-07-01-0.3045990.2131590.2771141.024359
2016-07-020.0678140.619885-1.620676-1.693934
2016-07-03-0.1416370.6595570.342833-0.216422
2016-07-040.2804240.669932-0.515944-0.873492
2016-07-05-0.663322-1.1746522.678657-0.923094
2016-07-06-0.4285510.539906-1.900090-1.580576
In [132]:
# column을 기준으로?
df2.sort_index(axis=1)
Out[132]:
ABCD
2016-07-02-1.6939340.619885-1.6206760.067814
2016-07-06-1.5805760.539906-1.900090-0.428551
2016-07-03-0.2164220.6595570.342833-0.141637
2016-07-011.0243590.2131590.277114-0.304599
2016-07-05-0.923094-1.1746522.678657-0.663322
2016-07-04-0.8734920.669932-0.5159440.280424
In [134]:
# 내림차순으로는?
df2.sort_index(axis=1, ascending=False)
Out[134]:
DCBA
2016-07-020.067814-1.6206760.619885-1.693934
2016-07-06-0.428551-1.9000900.539906-1.580576
2016-07-03-0.1416370.3428330.659557-0.216422
2016-07-01-0.3045990.2771140.2131591.024359
2016-07-05-0.6633222.678657-1.174652-0.923094
2016-07-040.280424-0.5159440.669932-0.873492
In [135]:
# 값 기준 정렬하기
# D열의 값이 오름차순이 되도록 정렬하기
df2.sort_values(by='D')
Out[135]:
DBCA
2016-07-05-0.663322-1.1746522.678657-0.923094
2016-07-06-0.4285510.539906-1.900090-1.580576
2016-07-01-0.3045990.2131590.2771141.024359
2016-07-03-0.1416370.6595570.342833-0.216422
2016-07-020.0678140.619885-1.620676-1.693934
2016-07-040.2804240.669932-0.515944-0.873492
In [136]:
# B열의 값이 내림차순이 되도록 정렬하기
df2.sort_values(by='B', ascending=False)
Out[136]:
DBCA
2016-07-040.2804240.669932-0.515944-0.873492
2016-07-03-0.1416370.6595570.342833-0.216422
2016-07-020.0678140.619885-1.620676-1.693934
2016-07-06-0.4285510.539906-1.900090-1.580576
2016-07-01-0.3045990.2131590.2771141.024359
2016-07-05-0.663322-1.1746522.678657-0.923094
In [138]:
df2["E"] = np.random.randint(0, 6, size=6)
df2["F"] = ["alpha", "beta", "gamma", "gamma", "alpha", "gamma"]
df2
Out[138]:
DBCAEF
2016-07-020.0678140.619885-1.620676-1.6939341alpha
2016-07-06-0.4285510.539906-1.900090-1.5805761beta
2016-07-03-0.1416370.6595570.342833-0.2164223gamma
2016-07-01-0.3045990.2131590.2771141.0243594gamma
2016-07-05-0.663322-1.1746522.678657-0.9230945alpha
2016-07-040.2804240.669932-0.515944-0.8734920gamma
In [139]:
# E열과 F열을 동시에 고려하여, 오름차순으로 하려면?
df2.sort_values(by=['E','F'])
Out[139]:
DBCAEF
2016-07-040.2804240.669932-0.515944-0.8734920gamma
2016-07-020.0678140.619885-1.620676-1.6939341alpha
2016-07-06-0.4285510.539906-1.900090-1.5805761beta
2016-07-03-0.1416370.6595570.342833-0.2164223gamma
2016-07-01-0.3045990.2131590.2771141.0243594gamma
2016-07-05-0.663322-1.1746522.678657-0.9230945alpha
In [140]:
# 지정한 행 또는 열에서 중복값을 제외한 유니크한 값만 얻기
df2['F'].unique()
Out[140]:
array(['alpha', 'beta', 'gamma'], dtype=object)
In [142]:
# 지정한 행 또는 열에서 값에 따른 개수 얻기
df2['F'].value_counts()
Out[142]:
gamma    3
alpha    2
beta     1
Name: F, dtype: int64
In [144]:
# 지정한 행 또는 열에서 입력한 값이 있는지 확인하기
df2['F'].isin(['alpha','beta'])
# 아래와 같이 응용할 수 있다.
Out[144]:
2016-07-02     True
2016-07-06     True
2016-07-03    False
2016-07-01    False
2016-07-05     True
2016-07-04    False
Name: F, dtype: bool
In [146]:
# F열의 값이 alpha나 beta인 모든 행 구하기
df2.loc[df2['F'].isin(['alpha','beta']),:]
Out[146]:
DBCAEF
2016-07-020.0678140.619885-1.620676-1.6939341alpha
2016-07-06-0.4285510.539906-1.900090-1.5805761beta
2016-07-05-0.663322-1.1746522.678657-0.9230945alpha

사용자가 직접 만든 함수를 적용하기

In [149]:
df3 = pd.DataFrame(np.random.randn(4, 3), columns=["b", "d", "e"],
                   index=["Seoul", "Incheon", "Busan", "Daegu"])
df3
Out[149]:
bde
Seoul0.806401-0.101789-0.201956
Incheon0.666876-2.144428-0.013760
Busan1.8112280.2253171.445495
Daegu-0.6084450.128199-0.325935
In [150]:
func = lambda x: x.max() - x.min()
In [151]:
df3.apply(func, axis=0)
Out[151]:
b    2.419673
d    2.369745
e    1.771431
dtype: float64



Reference : http://doorbw.tistory.com/172 [Tigercow.Door]



지금까지 감자코딩에 감자개발자의 Pandas에 대한 정리였습니다. 감사합니다.







공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함