Pandas 데이터 선택하기 (Selection)


Pandas 객체 생성하기 (Object creation)

Pandas DataFrame로부터 데이터를 선택하는 방법에 대해 알아봅니다.

순서는 아래와 같습니다.




Note

데이터를 선택하고 설정하는데 있어서 표준 Python/NumPy의 표현들이 직관적이고 작업에 편리하지만, pandas의 최적화된 데이터 접근 방식인 .at, .iat, .loc, .iloc의 사용을 권장합니다.


1) DataFrame 만들기

예제

import pandas as pd
import numpy as np

np.random.seed(0)

dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))

print(df)
                   A         B         C         D
2013-01-01  1.764052  0.400157  0.978738  2.240893
2013-01-02  1.867558 -0.977278  0.950088 -0.151357
2013-01-03 -0.103219  0.410599  0.144044  1.454274
2013-01-04  0.761038  0.121675  0.443863  0.333674
2013-01-05  1.494079 -0.205158  0.313068 -0.854096
2013-01-06 -2.552990  0.653619  0.864436 -0.742165

우선 DataFrame 객체를 하나 만들었습니다.


Pandas 데이터 선택하기 (Selection)



2) 열 선택하기

예제

print(df['A'])
#print(df.A)
print(type(df['A']))
#print(type(df.A))
2013-01-01    1.764052
2013-01-02    1.867558
2013-01-03   -0.103219
2013-01-04    0.761038
2013-01-05    1.494079
2013-01-06   -2.552990
Freq: D, Name: A, dtype: float64
<class 'pandas.core.series.Series'>

DataFrame의 하나의 열을 선택하면, 하나의 Series를 만듭니다.

df[‘A’]는 df.A와 같습니다.

Pandas 데이터 선택하기 (Selection)



3) 행 선택하기

예제1

print(df[0:3])
                   A         B         C         D
2013-01-01  1.764052  0.400157  0.978738  2.240893
2013-01-02  1.867558 -0.977278  0.950088 -0.151357
2013-01-03 -0.103219  0.410599  0.144044  1.454274

인덱스 숫자를 사용하면 행을 슬라이스할 수 있습니다.

Pandas 데이터 선택하기 (Selection)


예제2

print(df['20130102':'20130104'])
                   A         B         C         D
2013-01-02  1.867558 -0.977278  0.950088 -0.151357
2013-01-03 -0.103219  0.410599  0.144044  1.454274
2013-01-04  0.761038  0.121675  0.443863  0.333674

인덱스를 직접 사용해서 행을 선택할 수도 있습니다.

Pandas 데이터 선택하기 (Selection)



4) 레이블로 선택하기 (df.loc)

예제1

print(df.loc[dates[0]])
A    1.764052
B    0.400157
C    0.978738
D    2.240893
Name: 2013-01-01 00:00:00, dtype: float64

레이블을 이용해서 횡 방향 데이터를 얻습니다.

Pandas 데이터 선택하기 (Selection)


예제2

print(df.loc[:, ['A', 'B']])
                   A         B
2013-01-01  1.764052  0.400157
2013-01-02  1.867558 -0.977278
2013-01-03 -0.103219  0.410599
2013-01-04  0.761038  0.121675
2013-01-05  1.494079 -0.205158
2013-01-06 -2.552990  0.653619

레이블을 이용해서 여러 축을 선택합니다.

Pandas 데이터 선택하기 (Selection)


예제3

print(df.loc['20130102':'20130104', ['A', 'B']])
                   A         B
2013-01-02  1.867558 -0.977278
2013-01-03 -0.103219  0.410599
2013-01-04  0.761038  0.121675

슬라이스를 사용하면, 양 끝이 모두 포함됩니다.

Pandas 데이터 선택하기 (Selection)


예제4

print(df.loc['20130102', ['A', 'B']])
A    1.867558B   -0.977278
Name: 2013-01-02 00:00:00, dtype: float64

1차원으로 축소된 차원의 객체가 반환됩니다.

Pandas 데이터 선택하기 (Selection)


예제5

print(df.loc[dates[0], 'A'])
1.764052345967664

스칼라 값을 반환합니다.

Pandas 데이터 선택하기 (Selection)


예제6

print(df.at[dates[0], 'A'])
1.764052345967664

at을 사용하면 스칼라 값에 빠르게 접근할 수 있습니다.

Pandas 데이터 선택하기 (Selection)



5) 위치로 선택하기 (df.iloc)

예제1

print(df.iloc[3])
A    0.761038
B    0.121675
C    0.443863
D    0.333674
Name: 2013-01-04 00:00:00, dtype: float64

iloc[n]과 같이 정수를 입력하면 해당 행을 선택합니다.

Pandas 데이터 선택하기 (Selection)


예제2

print(df.iloc[3:5, 0:2])
                   A         B
2013-01-04  0.761038  0.121675
2013-01-05  1.494079 -0.205158

정수 슬라이스는 NumPy와 Python과 비슷하게 동작합니다.

Pandas 데이터 선택하기 (Selection)


예제3

print(df.iloc[[1, 2, 4], [0, 2]])
                   A         C
2013-01-02  1.867558  0.950088
2013-01-03 -0.103219  0.144044
2013-01-05  1.494079  0.313068

정수 위치의 리스트도 NumPy/Python과 비슷하게 동작합니다.

Pandas 데이터 선택하기 (Selection)


예제4

print(df.iloc[1:3, :])
                   A         B         C         D
2013-01-02  1.867558 -0.977278  0.950088 -0.151357
2013-01-03 -0.103219  0.410599  0.144044  1.454274

iloc[1:3, : ]은 행을 명시적으로 슬라이스합니다.

Pandas 데이터 선택하기 (Selection)


예제5

print(df.iloc[:, 1:3])
                   B         C
2013-01-01  0.400157  0.978738
2013-01-02 -0.977278  0.950088
2013-01-03  0.410599  0.144044
2013-01-04  0.121675  0.443863
2013-01-05 -0.205158  0.313068
2013-01-06  0.653619  0.864436

iloc[ : , 1:3]은 열을 명시적으로 슬라이스합니다.

Pandas 데이터 선택하기 (Selection)


예제6

print(df.iloc[1, 1])
-0.977277879876411

iloc[m, n] 과 같이 명시적으로 해당 위치의 값을 얻을 수 있습니다.

Pandas 데이터 선택하기 (Selection)


예제7

print(df.iat[1, 1])
-0.977277879876411

값에 대한 빠른 접근을 위해서는 iat[m, n]과 같이 사용합니다.

Pandas 데이터 선택하기 (Selection)



6) 불 인덱싱

예제1

print(df[df.A > 0])
                   A         B         C         D
2013-01-01  1.764052  0.400157  0.978738  2.240893
2013-01-02  1.867558 -0.977278  0.950088 -0.151357
2013-01-04  0.761038  0.121675  0.443863  0.333674
2013-01-05  1.494079 -0.205158  0.313068 -0.854096

하나의 열의 값을 기준으로 데이터를 선택할 수 있습니다.

df[df.A > 0]은 df로부터 A열이 0보다 큰 데이터를 보여줍니다.

Pandas 데이터 선택하기 (Selection)


예제2

print(df[df > 0])
                   A         B         C         D
2013-01-01  1.764052  0.400157  0.978738  2.240893
2013-01-02  1.867558       NaN  0.950088       NaN
2013-01-03       NaN  0.410599  0.144044  1.454274
2013-01-04  0.761038  0.121675  0.443863  0.333674
2013-01-05  1.494079       NaN  0.313068       NaN
2013-01-06       NaN  0.653619  0.864436       NaN

조건식이 성립하는 값들을 DataFrame으로부터 선택합니다.

Pandas 데이터 선택하기 (Selection)


예제3

df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']

print(df2)
print(df2[df2['E'].isin(['two', 'four'])])
                   A         B         C         D      E
2013-01-01  1.764052  0.400157  0.978738  2.240893    one
2013-01-02  1.867558 -0.977278  0.950088 -0.151357    one
2013-01-03 -0.103219  0.410599  0.144044  1.454274    two
2013-01-04  0.761038  0.121675  0.443863  0.333674  three
2013-01-05  1.494079 -0.205158  0.313068 -0.854096   four
2013-01-06 -2.552990  0.653619  0.864436 -0.742165  three
                   A         B         C         D     E
2013-01-03 -0.103219  0.410599  0.144044  1.454274   two
2013-01-05  1.494079 -0.205158  0.313068 -0.854096  four

isin() 메서드를 이용해서 E열의 값이 ‘two’와 ‘four’를 포함하는 경우를 필터링합니다.

Pandas 데이터 선택하기 (Selection)



7) 데이터 설정하기

예제1

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

df['F'] = s1
print(df)
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

                   A         B         C         D    F
2013-01-01  0.000000  0.400157  0.978738  2.240893  NaN
2013-01-02  1.867558 -0.977278  0.950088 -0.151357  1.0
2013-01-03 -0.103219  0.410599  0.144044  1.454274  2.0
2013-01-04  0.761038  0.121675  0.443863  0.333674  3.0
2013-01-05  1.494079 -0.205158  0.313068 -0.854096  4.0
2013-01-06 -2.552990  0.653619  0.864436 -0.742165  5.0

새로운 열을 설정하면, 인덱스에 따라 데이터가 자동 정렬됩니다.

새로운 Series를 하나 만들어서 DataFrame의 ‘F’열로 지정했습니다.

Pandas 데이터 선택하기 (Selection)


예제2

df.at[dates[0], 'A'] = 0

print(df)
                   A         B         C         D    F
2013-01-01  0.000000  0.400157  0.978738  2.240893  NaN
2013-01-02  1.867558 -0.977278  0.950088 -0.151357  1.0
2013-01-03 -0.103219  0.410599  0.144044  1.454274  2.0
2013-01-04  0.761038  0.121675  0.443863  0.333674  3.0
2013-01-05  1.494079 -0.205158  0.313068 -0.854096  4.0
2013-01-06 -2.552990  0.653619  0.864436 -0.742165  5.0

at과 레이블을 사용해서 값을 설정할 수 있습니다.

Pandas 데이터 선택하기 (Selection)


예제3

df.iat[0, 1] = 0

print(df)
                   A         B         C         D    F
2013-01-01  0.000000  0.000000  0.978738  2.240893  NaN
2013-01-02  1.867558 -0.977278  0.950088 -0.151357  1.0
2013-01-03 -0.103219  0.410599  0.144044  1.454274  2.0
2013-01-04  0.761038  0.121675  0.443863  0.333674  3.0
2013-01-05  1.494079 -0.205158  0.313068 -0.854096  4.0
2013-01-06 -2.552990  0.653619  0.864436 -0.742165  5.0

iat과 위치 인덱스를 이용해서 값을 설정할 수도 있습니다.

Pandas 데이터 선택하기 (Selection)


예제4

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

print(df)
                   A         B         C    D    F
2013-01-01  0.000000  0.000000  0.978738  5.0  NaN
2013-01-02  1.867558 -0.977278  0.950088  5.0  1.0
2013-01-03 -0.103219  0.410599  0.144044  5.0  2.0
2013-01-04  0.761038  0.121675  0.443863  5.0  3.0
2013-01-05  1.494079 -0.205158  0.313068  5.0  4.0
2013-01-06 -2.552990  0.653619  0.864436  5.0  5.0

loc을 사용해서 NumPy 어레이를 할당함으로써 값을 설정했습니다.

Pandas 데이터 선택하기 (Selection)


예제5

df2 = df.copy()
df2[df2 > 0] = -df2

print(df2)
                   A         B         C    D    F
2013-01-01  0.000000  0.000000 -0.978738 -5.0  NaN
2013-01-02 -1.867558 -0.977278 -0.950088 -5.0 -1.0
2013-01-03 -0.103219 -0.410599 -0.144044 -5.0 -2.0
2013-01-04 -0.761038 -0.121675 -0.443863 -5.0 -3.0
2013-01-05 -1.494079 -0.205158 -0.313068 -5.0 -4.0
2013-01-06 -2.552990 -0.653619 -0.864436 -5.0 -5.0

조건식을 이용해서 값을 설정할 수 있습니다.

DataFrame (df2)를 하나 만들고 0보다 큰 값들의 부호를 반대로 했습니다.

Pandas 데이터 선택하기 (Selection)


이전글/다음글