본문 바로가기
Programming/Python

[python] 10 Minutes to pandas - 선택

by NAMP 2017. 3. 24.

[python] 10 Minutes to pandas - 선택

선택 Selection

선택 및 설정을 위한 표준 Python / Numpy 표현 방식은 직관적이며 양방향 작업, 생산적 코드에 편리하지만, padas 데이터 최적화 방법 인 .at, .iat, .loc, .iloc 및 .ix를 권장합니다.

인덱싱 문서보기

인덱싱 및 데이터 선택 / 고급 인덱싱

얻기

df.A와 같이 Series를 제공하는 단일 열 선택


In [23]: df['A']
Out[23]: 
2013-01-01    0.469112
2013-01-02    1.212112
2013-01-03   -0.861849
2013-01-04    0.721555
2013-01-05   -0.424972
2013-01-06   -0.673690
Freq: D, Name: A, dtype: float64

행을 분할하는 [ ]를 통해 선택합니다.


In [24]: df[0:3]
Out[24]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

In [25]: df['20130102':'20130104']
Out[25]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860

라벨 별 선택

레이블 별 선택에서 자세한 내용을 확인 할 수 있있습니다.

라벨을 사용하여 row 정보 얻기


In [26]: df.loc[dates[0]]
Out[26]: 
A    0.469112
B   -0.282863
C   -1.509059
D   -1.135632
Name: 2013-01-01 00:00:00, dtype: float64

레이블로 다중 축에서 선택하기


In [27]: df.loc[:,['A','B']]
Out[27]: 
                   A         B
2013-01-01  0.469112 -0.282863
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020
2013-01-06 -0.673690  0.113648

양쪽 끝점을 포함하여 라벨별 선택


In [28]: df.loc['20130102':'20130104',['A','B']]
Out[28]: 
                   A         B
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771

반환 된 객체의 차원 축소 (하나의 차원이 줄어듦)


In [29]: df.loc['20130102',['A','B']]
Out[29]: 
A    1.212112
B   -0.173215
Name: 2013-01-02 00:00:00, dtype: float64

스칼라 값 얻기


In [30]: df.loc[dates[0],'A']
Out[30]: 0.46911229990718628

스칼라에 빠르게 접근하기 (이전 내용과 동일) at을 사용하여 접근


In [31]: df.at[dates[0],'A']
Out[31]: 0.46911229990718628

위치 별 선택

위치 별 선택에서 더보기

전달된 정수를 통해 위치를 선택합니다.


In [32]: df.iloc[3]
Out[32]: 
A    0.721555
B   -0.706771
C   -1.039575
D    0.271860
Name: 2013-01-04 00:00:00, dtype: float64

정수 분할은 numpy / python과 유사하게 동작합니다.


In [33]: df.iloc[3:5,0:2]
Out[33]: 
                   A         B
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020

위와 같은 dataframe이 있는 경우, df.iloc[3:5,0:2] 를 실행하면,

첫번째 파라미터는 데이터의 row 를 의미합니다. 0부터 시작한 인덱스는 3인 2016-09-08 을 의미하며, 3:5 이므로 4까지 포함됩니다.

두번째 파라미터는 데이터의 column을 의미합니다. 0:2 이므로 Open, High 를 의미합니다.

numpy / python 스타일과 비슷한 방법으로 정수 리스트를 사용하여 위치를 지정합니다.


In [34]: df.iloc[[1,2,4],[0,2]]
Out[34]: 
                   A         C
2013-01-02  1.212112  0.119209
2013-01-03 -0.861849 -0.494929
2013-01-05 -0.424972  0.276232

명시적으로 행 분할하기


In [35]: df.iloc[1:3,:]
Out[35]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

명시적으로 열 분할하기


In [36]: df.iloc[:,1:3]
Out[36]: 
                   B         C
2013-01-01 -0.282863 -1.509059
2013-01-02 -0.173215  0.119209
2013-01-03 -2.104569 -0.494929
2013-01-04 -0.706771 -1.039575
2013-01-05  0.567020  0.276232
2013-01-06  0.113648 -1.478427

명시적으로 값 가져오기


In [37]: df.iloc[1,1]
Out[37]: -0.17321464905330858

스칼라에 빠르게 접근하기 (이전 내용과 동일) iat를 사용


In [38]: df.iat[1,1]
Out[38]: -0.17321464905330858

Boolean 인덱싱

단일 열의 값을 사용하여 데이터를 선택합니다. A의 값이 0 보다 큰 경우만 선택합니다.


In [39]: df[df.A > 0]
Out[39]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-04  0.721555 -0.706771 -1.039575  0.271860

isin()함수를 사용하여 필터링 합니다.


In [41]: df2 = df.copy()

In [42]: df2['E'] = ['one', 'one','two','three','four','three']

In [43]: df2
Out[43]: 
                   A         B         C         D      E
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three

In [44]: df2[df2['E'].isin(['two','four'])]
Out[44]: 
                   A         B         C         D     E
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four

설정

새 열을 설정하면 데이터가 인덱스별로 자동으로 정렬됩니다.


In [45]: s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))

In [46]: s1
Out[46]: 
2013-01-02    1
2013-01-03    2
2013-01-04    3
2013-01-05    4
2013-01-06    5
2013-01-07    6
Freq: D, dtype: int64

In [47]: df['F'] = s1

라벨별로 값 설정하기


In [48]: df.at[dates[0],'A'] = 0

위치 별 값 설정


In [49]: df.iat[0,1] = 0

numpy 배열로 설정하기


In [50]: df.loc[:,'D'] = np.array([5] * len(df))

설정 작업 이전


In [51]: df
Out[51]: 
                   A         B         C  D    F
2013-01-01  0.000000  0.000000 -1.509059  5  NaN
2013-01-02  1.212112 -0.173215  0.119209  5  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0
2013-01-05 -0.424972  0.567020  0.276232  5  4.0
2013-01-06 -0.673690  0.113648 -1.478427  5  5.0

설정 작업 결과. 0 보다 큰 모든 값들이 -로 변경됨.


In [52]: df2 = df.copy()

In [53]: df2[df2 > 0] = -df2

In [54]: df2
Out[54]: 
                   A         B         C  D    F
2013-01-01  0.000000  0.000000 -1.509059 -5  NaN
2013-01-02 -1.212112 -0.173215 -0.119209 -5 -1.0
2013-01-03 -0.861849 -2.104569 -0.494929 -5 -2.0
2013-01-04 -0.721555 -0.706771 -1.039575 -5 -3.0
2013-01-05 -0.424972 -0.567020 -0.276232 -5 -4.0
2013-01-06 -0.673690 -0.113648 -1.478427 -5 -5.0

출처

댓글