DataFrame안의 데이터 접근¶
데이터 프레임은 로우와 칼럼으로 구성되며 이 정보를 이용하여 데이터를 선택할 수 있습니다. 선택 작업에는 [], .loc[], iloc[]등을 사용합니다. 데이터를 사용하기 위해 kospi 주식정보를 사용합니다.
kospi = pd.read_csv("./^KS11.csv", index_col ='Date')
kospi
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
... | ... | ... | ... | ... | ... | ... |
2021-12-20 | 3001.330078 | 3001.330078 | 2962.070068 | 2963.000000 | 2963.000000 | 377100 |
2021-12-21 | 2981.669922 | 2984.560059 | 2955.899902 | 2975.030029 | 2975.030029 | 410500 |
2021-12-22 | 2993.500000 | 3000.790039 | 2976.649902 | 2984.479980 | 2984.479980 | 461400 |
2021-12-23 | 2998.020020 | 3000.699951 | 2980.909912 | 2998.169922 | 2998.169922 | 483300 |
2021-12-24 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | 537500 |
247 rows × 6 columns
1. 데이터 프레임의 칼럼 선택하기, []연산자¶
[] 연산자를 이용하여 데이터프레임의 칼럼 정보를 가져올 수 있습니다. 위의 kospi 데이터프레임은 어떤 칼럼을 갖고 있는 지 확인해보겠습니다.
kospi.columns
Index(['Open', 'High', 'Low', 'Close', 'Adj Close', 'Volume'], dtype='object')
kospi 데이터 프레임의 칼럼 정보를 확인하기 위해 .columns 를 사용합니다. 5번째 칼럼명인 'Adj Close' 칼럼을 []연산자로 선택합니다.
kospi_adj = kospi['Adj Close']
kospi_adj
Date
2020-12-28 2808.600098
2020-12-29 2820.510010
2020-12-30 2873.469971
2021-01-04 2944.449951
2021-01-05 2990.570068
...
2021-12-20 2963.000000
2021-12-21 2975.030029
2021-12-22 2984.479980
2021-12-23 2998.169922
2021-12-24 3012.429932
Name: Adj Close, Length: 247, dtype: float64
type(kospi_adj)
pandas.core.series.Series
kospi_adj는 kospi의 데이터프레임중 하나의 칼럼만 가져온 결과이기 때문에 type 결과가 series로 표시됩니다. 하지만 아래와 같이 하나 이상의 칼럼을 선택할 경우에는 데이터프레임으로 표시됩니다.
kospi_close_volume = kospi[['Close', 'Volume']]
kospi_close_volume
Close | Volume | |
---|---|---|
Date | ||
2020-12-28 | 2808.600098 | 1006200 |
2020-12-29 | 2820.510010 | 1046800 |
2020-12-30 | 2873.469971 | 1074000 |
2021-01-04 | 2944.449951 | 1026500 |
2021-01-05 | 2990.570068 | 1519900 |
... | ... | ... |
2021-12-20 | 2963.000000 | 377100 |
2021-12-21 | 2975.030029 | 410500 |
2021-12-22 | 2984.479980 | 461400 |
2021-12-23 | 2998.169922 | 483300 |
2021-12-24 | 3012.429932 | 537500 |
247 rows × 2 columns
type(kospi_close_volume)
pandas.core.frame.DataFrame
2. 데이터 프레임의 칼럼 가져오기, '.' 속성¶
데이터프레임의 속성을 접근하는 . 을 이용할 수 있습니다. 하지만 속성으로 접근하는 경우 칼럼의 이름에 공백이 있는 경우 사용할 수 없습니다.
kospi_open = kospi.Open
kospi_open
Date
2020-12-28 2820.949951
2020-12-29 2810.550049
2020-12-30 2820.360107
2021-01-04 2874.500000
2021-01-05 2943.669922
...
2021-12-20 3001.330078
2021-12-21 2981.669922
2021-12-22 2993.500000
2021-12-23 2998.020020
2021-12-24 3009.479980
Name: Open, Length: 247, dtype: float64
3. 데이터 프레임의 로우 가져오기, .loc[]¶
kospi.loc['2020-12-28']
Open 2.820950e+03
High 2.834590e+03
Low 2.799560e+03
Close 2.808600e+03
Adj Close 2.808600e+03
Volume 1.006200e+06
Name: 2020-12-28, dtype: float64
여러 개의 로우를 가져올 때에는 아래와 같이 확인이 필요한 index정보를 가진 list를 전달합니다.
kospi.loc[['2021-12-01', '2021-12-02']]
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2021-12-01 | 2860.120117 | 2905.73999 | 2837.030029 | 2899.719971 | 2899.719971 | 563100 |
2021-12-02 | 2874.639893 | 2945.27002 | 2874.639893 | 2945.270020 | 2945.270020 | 533700 |
4. 데이터 프레임의 로우 가져오기 .iloc[]¶
.iloc[] 을 사용하면 포지션 정보를 이용하여 로우값을 가져올 수 있습니다.
kospi.iloc[[0,1]]
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
아래와 같이 0번째 부터 9번째 로우값을 가져오기 위해서 numpy arange함수를 이용하여 kospi 데이터프레임 정보를 가져올 수 있습니다.
np.arange(0,10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
kospi.iloc[np.arange(0,10)]
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
2021-01-06 | 2993.340088 | 3027.159912 | 2961.370117 | 2968.209961 | 2968.209961 | 1793400 |
2021-01-07 | 2980.750000 | 3055.280029 | 2980.750000 | 3031.679932 | 3031.679932 | 1524700 |
2021-01-08 | 3040.110107 | 3161.110107 | 3040.110107 | 3152.179932 | 3152.179932 | 1297900 |
2021-01-11 | 3161.899902 | 3266.229980 | 3096.189941 | 3148.449951 | 3148.449951 | 1712500 |
2021-01-12 | 3145.870117 | 3154.790039 | 3047.560059 | 3125.949951 | 3125.949951 | 1388600 |
kospi는 주식정보로 특정 기간동안의 주식정보를 확인려는 경우가 발생할 수 있습니다. 이처럼 특정 index구간의 로우값을 확인하는 경우 인덱스 레이블 위치를 확인하여 해당 인덱스 구간의 로우값을 확인할 수 있습니다.
start_idx = kospi.index.get_loc('2021-11-01')
end_idx = kospi.index.get_loc('2021-12-01')
print("start index : {}, end index : {}".format(start_idx, end_idx))
start index : 207, end index : 229
위의 get_loc()을 이용하여 kospi 데이터프레임의 index 중 '2021-11-01'의 시작과 '2021-12-01'의 종료 위치를 각각 start_idx, end_idx에 저장합니다. 아래와 같이 시작위치는 207번째 index이고 종료위치는 229번째 위치임을 알 수 있습니다.
시작위치와 종료위치를 확인하였으니 range()함수를 이용하여 index의 시작과 종료까지의 index값을 가지는 리스트를 생성하고 iloc[]에 사용하여 kospi 데이터프레임 중 필요한 로우정보를 확인할 수 있습니다.
주의할 점은 229번째 로우값을 얻기 위해 아래의 슬라이싱의 end값은 230을 사용한 부분입니다.
kospi[207:230]
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2021-11-01 | 2984.179932 | 2991.810059 | 2976.870117 | 2978.939941 | 2978.939941 | 475000 |
2021-11-02 | 2995.580078 | 3034.300049 | 2995.580078 | 3013.489990 | 3013.489990 | 525400 |
2021-11-03 | 3020.360107 | 3020.870117 | 2969.010010 | 2975.709961 | 2975.709961 | 658300 |
2021-11-04 | 3000.919922 | 3011.560059 | 2978.070068 | 2983.219971 | 2983.219971 | 771700 |
2021-11-05 | 3003.530029 | 3003.530029 | 2953.959961 | 2969.270020 | 2969.270020 | 687400 |
2021-11-08 | 2965.360107 | 2968.179932 | 2930.899902 | 2960.199951 | 2960.199951 | 559600 |
2021-11-09 | 2958.149902 | 2987.280029 | 2949.169922 | 2962.459961 | 2962.459961 | 707800 |
2021-11-10 | 2947.459961 | 2958.610107 | 2924.360107 | 2930.169922 | 2930.169922 | 567300 |
2021-11-11 | 2911.409912 | 2925.189941 | 2903.719971 | 2924.919922 | 2924.919922 | 571900 |
2021-11-12 | 2945.949951 | 2973.840088 | 2938.270020 | 2968.800049 | 2968.800049 | 665000 |
2021-11-15 | 2989.679932 | 3003.709961 | 2979.959961 | 2999.520020 | 2999.520020 | 638900 |
2021-11-16 | 2995.679932 | 3011.879883 | 2985.340088 | 2997.209961 | 2997.209961 | 579000 |
2021-11-17 | 3004.020020 | 3004.669922 | 2957.699951 | 2962.419922 | 2962.419922 | 540700 |
2021-11-18 | 2959.260010 | 2964.479980 | 2937.530029 | 2947.379883 | 2947.379883 | 541100 |
2021-11-19 | 2951.060059 | 2974.639893 | 2948.070068 | 2971.020020 | 2971.020020 | 656300 |
2021-11-22 | 2983.379883 | 3018.010010 | 2980.729980 | 3013.250000 | 3013.250000 | 531000 |
2021-11-23 | 3013.159912 | 3016.360107 | 2992.139893 | 2997.330078 | 2997.330078 | 524200 |
2021-11-24 | 3006.340088 | 3017.899902 | 2981.020020 | 2994.290039 | 2994.290039 | 556600 |
2021-11-25 | 2996.739990 | 2996.739990 | 2973.239990 | 2980.270020 | 2980.270020 | 595400 |
2021-11-26 | 2973.040039 | 2985.770020 | 2930.310059 | 2936.439941 | 2936.439941 | 594700 |
2021-11-29 | 2906.149902 | 2930.219971 | 2890.780029 | 2909.320068 | 2909.320068 | 841700 |
2021-11-30 | 2932.709961 | 2942.929932 | 2822.729980 | 2839.010010 | 2839.010010 | 982400 |
2021-12-01 | 2860.120117 | 2905.739990 | 2837.030029 | 2899.719971 | 2899.719971 | 563100 |
5. 로우, 컬럼을 모두 이용하여 스칼라 검색, (at[], iat[])¶
kospi 데이터프레임의 정보 중 로우가 '2021년 10월 1일'이고 컬럼이 'volume'인 스칼라값을 확인해 봅니다. at[]을 이용 시 첫번째로 로우값과 두번째로 컬럼값을 전달하여 사용합니다.
kospi.at['2021-10-01', 'Volume']
854800
정확한 값을 가져왔는지 확인하기 위해 .loc[]을 이용하여 '2021-10-01'의 로우값을 확인하면 아래와 같이 'Volume' 컬럼이 854800으로 올바른 값을 가져온 것을 확인할 수 있습니다.
kospi.loc['2021-10-01']
Open 3056.209961
High 3062.600098
Low 3015.010010
Close 3019.179932
Adj Close 3019.179932
Volume 854800.000000
Name: 2021-10-01, dtype: float64
.iat[]을 이용 시 데이터프레임의 로우와 칼럼의 순서를 위치정보로 전달하여 값을 얻을 수 있습니다. 위외 동일한 스칼라값을 확인하기 위해서 kospi 데이터프레임의 로우와 컬럼에서 위치를 확인합니다. 위치를 확인하기 위해서 아래와 같이 get_loc()함수를 kospi 데이터 프레임의 index와 columns에 사용합니다.
print ("Row Index : {}, Col Index : {}".format(kospi.index.get_loc('2021-10-01'), kospi.columns.get_loc('Volume')))
Row Index : 188, Col Index : 5
위치값을 확인하면 로우는 188번째 값이고 컬럼은 5번째값임을 알 수 있습니다. 이 위치 정보를 .iat[]에 이용하여 해당 위치의 스칼라값을 확인하면 처음 확인했던 854800이 출력되는 것을 확인할 수 있습니다.
kospi.iat[kospi.index.get_loc('2021-10-01'), kospi.columns.get_loc('Volume')]
854800
6. 불리언 선택을 이용하여 로우 선택¶
불리언 선택을 이용하여 kospi의 종가가 평균보다 작았던 로우를 선택해보겠습니다. 우선 kospi데이터 프레임의 종가 평균을 얻기 위해 mean()을 사용하고 Close 컬럼의 평균값을 확인합니다. 그리고 이값을 불리언 선택으로 사용하여 kospi 종가가 평균보다 낮은 로우를 아래와 같이 선택합니다.
kospi[kospi.Close < kospi.mean().Close]
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
... | ... | ... | ... | ... | ... | ... |
2021-12-20 | 3001.330078 | 3001.330078 | 2962.070068 | 2963.000000 | 2963.000000 | 377100 |
2021-12-21 | 2981.669922 | 2984.560059 | 2955.899902 | 2975.030029 | 2975.030029 | 410500 |
2021-12-22 | 2993.500000 | 3000.790039 | 2976.649902 | 2984.479980 | 2984.479980 | 461400 |
2021-12-23 | 2998.020020 | 3000.699951 | 2980.909912 | 2998.169922 | 2998.169922 | 483300 |
2021-12-24 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | 537500 |
113 rows × 6 columns
kospi 데이터프레인 전체 기간중 몇일이 평균이하였는지 확인하기 위해서 head()와 tail()을 사용합니다.
kospi.head()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
kospi.tail()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2021-12-20 | 3001.330078 | 3001.330078 | 2962.070068 | 2963.000000 | 2963.000000 | 377100 |
2021-12-21 | 2981.669922 | 2984.560059 | 2955.899902 | 2975.030029 | 2975.030029 | 410500 |
2021-12-22 | 2993.500000 | 3000.790039 | 2976.649902 | 2984.479980 | 2984.479980 | 461400 |
2021-12-23 | 2998.020020 | 3000.699951 | 2980.909912 | 2998.169922 | 2998.169922 | 483300 |
2021-12-24 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | 537500 |
kospi.shape
(247, 6)
위와 같이 kospi 데이터프레임은 247개의 로우를 갖고 있으며 2020년 12월 28일부터 2021년 12월 24일까지 데이터임을 알 수 있습니다. 따라서 해당 기간의 247일 동안 113일이 평균이하의 종가임을 알 수 있습니다.
특정 날짜의 종가와 볼륨을 가져오는 경우와 같이 여러 조건을 함께 사용하는 경우 아래와 같이 사용합니다. kospi Close(종가)가 3000 이상이고 Volume(거래량)이 1000000일때의 'Close'와 'Volume' 컬럼을 확인할 때 아래와 같이 불리언 선택을 사용할 수 있습니다.
kospi[(kospi.Close > 3000) & (kospi.Volume > 1000000)] [['Close', 'Volume']]
Close | Volume | |
---|---|---|
Date | ||
2021-01-07 | 3031.679932 | 1524700 |
2021-01-08 | 3152.179932 | 1297900 |
2021-01-11 | 3148.449951 | 1712500 |
2021-01-12 | 3125.949951 | 1388600 |
2021-01-13 | 3148.290039 | 1578000 |
... | ... | ... |
2021-07-12 | 3246.469971 | 1134600 |
2021-07-13 | 3271.379883 | 1149500 |
2021-07-15 | 3286.219971 | 1171900 |
2021-07-16 | 3276.909912 | 1066100 |
2021-07-19 | 3244.040039 | 1095100 |
105 rows × 2 columns
'Programming > Pandas' 카테고리의 다른 글
[Pandas] 중복 데이터 제거하기 (0) | 2022.01.04 |
---|---|
[Pandas] 모든 컬럼이 NaN일 때만 삭제하기 (0) | 2022.01.03 |
[Pandas] 리인덱싱 (0) | 2022.01.01 |
[Pandas] 불리언 선택 (0) | 2021.12.31 |
[Pandas] 날짜범위 index 만들기 (0) | 2021.12.26 |