-
chapter-03 판다스 데이터프레임과 시리즈판다스 2021. 9. 17. 03:36
03-1 나만의 데이터 만들기¶
02장에서는 파일에서 데이터 집합을 불러온 다음 실습을 진행했습니다. 이번에는 실습에 사용할 시리즈와 데이터프레임을 직접 만들어서 진행하겠습니다.
In [27]:import pandas as pd s=pd.Series(['banana', 42]) print(s)
0 banana 1 42 dtype: object
2. 02장에서 인덱스는 보통 0부터 시작한다고 설명했던 것을 기억하나요? 하지만 시리즈를 생성할 때 문자열을 인덱스로 지정할 수도 있습니다. 문자열을 인덱스로 지정하려면 Series 메서드의 index 인자를 통해 인덱스로 사용하고자 하는 문자열을 리스트에 담아 전달하면 됩니다.¶
In [28]:s=pd.Series(['Wes Mckinney', 'Creator of Pandas']) print(s)
0 Wes Mckinney 1 Creator of Pandas dtype: object
In [29]:s = pd.Series(['Wes McKinney','Creator of Pandas'],index=['Person','Who']) print(s)
Person Wes McKinney Who Creator of Pandas dtype: object
3. 데이터프레임 만들기¶
데이터프레임을 만들기 위해서는 딕셔너리를 DaitaFram클래스에 전달해야 합니다.
In [30]:scientists= pd.DataFrame({ 'name':['Rosaline Franklin','William Gosset'], 'Occupation':['Chemist','Statistician'], 'Died':['1957-04-16','1937-10-16'], 'Born':['1920-07-25','1876-06-13'], 'Age':[37,61]} ) print(scientists)
name Occupation Died Born Age 0 Rosaline Franklin Chemist 1957-04-16 1920-07-25 37 1 William Gosset Statistician 1937-10-16 1876-06-13 61
4.¶
시리즈와 마찬가지로 데이터프레임도 인덱스를 따로 지정하지 않으면 인덱스를 0부터 자동으로 생성합니다. 인덱스를 따로 지정하려면 index 인자에 리스트를 전달하면 됩니다. 또 columns 인자를 사용하면 데이터프레임의 열 순서를 지정할 수 있습니다. 예를 들어 데이터프레임을 만들 때 Occupation,Born, Died,Age의 순서로 딕셔너리를 전달했어도 columns 인자에 Occupation,Born, Died,Age의 순서로 열 이름을 전달하면 생성된 데이터프레임의 열 순서는 columns에 전달한 값을 따라갑니다.
In [31]:scientists=pd.DataFrame( data={'Occupation':['Chemist','Statistician'], 'Born':['1920-07-25','1876-06-13'], 'Died':['1957-04-16','1937-10-16'], 'Age':[37,61]}, index=['Rosaline Franklin','William Gosset'], columns=['Occupation','Born','Age','Died'] ) print(scientists)
Occupation Born Age Died Rosaline Franklin Chemist 1920-07-25 37 1957-04-16 William Gosset Statistician 1876-06-13 61 1937-10-16
5.¶
과정 1에서 데이터프레임을 만들 대 딕셔너리를 전달한다고 했습니다. 그런데 딕셔너리는 키(Key)와 값(Value)으로 이루어진 한 쌍의 데이터들의 순서는 보장하지 않습니다. 만약 순서가 보장된 딕셔너리를 던달하려면 OrdereDict를 사용해야 합니다. 다음과 같이 입력하면 딕셔너리의 데이터 순서를 그대로 유지하면서 데이터프레임을 만들 수 있습니다.
In [32]:from collections import OrderedDict scientists=pd.DataFrame(OrderedDict([ ('Name',['Rosaline Franklin','William Gosset']), ('Occupation',['Chemist','Statistician']), ('Died',['1957-04-16','1937-10-16']), ('Born',['1920-07-25','1876-06-13']), ('Age',[37,61]) ]) ) print(scientists)
Name Occupation Died Born Age 0 Rosaline Franklin Chemist 1957-04-16 1920-07-25 37 1 William Gosset Statistician 1937-10-16 1876-06-13 61
03-2 시리즈 다루기 - 기초¶
판다스의 데이터를 구성하는 가장 기본 단위는 시리즈입니다. 이번에는 데이터프레임에서 시리즈를 선택하는 방법에 대해 알아보겠습니다.
In [33]:scientists=pd.DataFrame( data={'Occupation':['Chemist','Statistician'], 'Born':['1920-07-25','1876-06-13'], 'Died':['1957-04-16','1937-10-16'], 'Age':[37,61]}, index=['Rosaline Franklin','William Gosset'], columns=['Occupation','Born','Age','Died'])
2.¶
데이터프레임에서 시리즈를 선택하려면 loc 속성에 인덱스를 전달하면 됩니다. 정말 시리즈를 선택한 것인지 확인하기 위해 type으로 한 번 더 검사합니다.
In [34]:first_row=scientists.loc['William Gosset'] print(type(first_row))
<class 'pandas.core.series.Series'>
3.¶
first_row 를 출력해 보겠습니다. 여기서 주목해야 할 점은 데이터프레임을 만들 때 Age열에 정수형 리스트를 전달해도 시리즈를 출력해 보면 시리즈의 자료형을 오브젝트로 인식한다는 점입니다.
In [35]:print(first_row)
Occupation Statistician Born 1876-06-13 Age 61 Died 1937-10-16 Name: William Gosset, dtype: object
시리즈 속성과 메서드 사용하기 - index, values, keys¶
01장에서 실습한 loc,iloc와 같은 속성 외에도 시리즈에는 다양한 속성이 미리 정의되어 있습니다. 이번에는 index, values 속성과 keys메서드에 대해 알아보겠습니다.
index, values 속성과 keys메서드 사용하기¶
1.index 속성 사용하기¶
먼저 index 속성을 사용해 보겠습니다. index 속성에는 시리즈의 인덱스가 들어 있습니다.
In [36]:print(first_row.index)
Index(['Occupation', 'Born', 'Age', 'Died'], dtype='object')
2. values 속성 사용하기¶
values 속성에는 시리즈의 데이터가 저장되어 있습니다.
In [37]:print(first_row.values)
['Statistician' '1876-06-13' 61 '1937-10-16']
3. keys 메서드 사용하기¶
keys는 속성이 아니라 메서드입니다. keys 메서드의 기능은 무엇일까요? keys 메서드는 index속성과 같은 역할을 합니다. 즉, 과정1의 결과와 동일한 결괏값을 얻을 수 있습니다.
In [38]:print(first_row.keys())
Index(['Occupation', 'Born', 'Age', 'Died'], dtype='object')
4. index 속성 응용하기¶
만약 index 속성의 첫 번째 값을 추출하려면 다음과 같이 코드를 작성하면 됩니다.
In [39]:print(first_row.index[0])
Occupation
5. keys 메서드 응용하기¶
keys 메서드의 결괏값을 이용하여 인덱스의 첫 번째 값을 추출하는 방법은 다음과 같습니다.
In [40]:print(first_row.keys()[0])
Occupation
시리즈의 기초 통계 메서드 사용하기¶
시리즈에는 keys 메서드 외에도 다양한 메서드가 있습니다. 이번에는 시리즈에 미리 정의되어 있는 mean, min, max, std 메서드의 사용 방법을 알아보겠습니다.
시리즈의 mean, min, max, std 메서드 사용하기¶
1.¶
이번에는 scientists의 Age 열을 추출해 보겠습니다.
In [41]:ages = scientists['Age'] print(ages)
Rosaline Franklin 37 William Gosset 61 Name: Age, dtype: int64
2.¶
만약 시리즈를 구성하는 데이터가 정수라면 mean, min, max, std와 같은 통계 메서드를 사용할 수 있습니다.
In [42]:print(ages.mean())
49.0
In [43]:print(ages.min())
37
In [44]:print(ages.max())
61
In [45]:print(ages.std())
16.97056274847714
다음은 시리즈에서 자주 사용하는 메서드를 정리한 표입니다. 앞으로 종종 사용할 메서드이므로 한 번 읽어보고 넘어가기 바랍니다.
시리즈 메서드 정리¶
시리즈 메서드$\qquad$$\qquad$$\qquad$$\qquad$설명
- append $\qquad$$\qquad$$\qquad$$\qquad$2개 이상의 시리즈 연결
- describe$\qquad$$\qquad$$\qquad$$\qquad$요약 통계량 계산
- drop_duplicates$\qquad$$\qquad$$\quad$중복값이 없는 시리즈 변환
- equals$\qquad$$\qquad$$\qquad$$\qquad$시리즈에 해당 값을 가진 요소가 있는지 확인
- get_values$\qquad$$\qquad$$\qquad$$\quad$시리즈 값 구하기(values 속성과 동일)
- isin$\qquad$$\qquad$$\qquad$$\qquad$$\quad$시리즈에 포함된 값이 있는지 확인
- min$\qquad$$\qquad$$\qquad$$\qquad$$\qquad$최소값 반환
- max$\qquad$$\qquad$$\qquad$$\qquad$$\qquad$최대값 반환
- mean$\qquad$$\qquad$$\qquad$$\qquad$$\quad$산술 평균 반환
- median$\qquad$$\qquad$$\qquad$$\qquad$$\quad$중간값 반환
- replace$\qquad$$\qquad$$\qquad$$\qquad$특정 값을 가진 시리즈 값을 교체
- sample$\qquad$$\qquad$$\qquad$$\qquad$시리즈에서 임의의 값을 반환
- sort_values$\qquad$$\qquad$$\qquad$$\qquad$값을 정렬
- to_frame$\qquad$$\qquad$$\qquad$$\qquad$시리즈를 데이터프레임으로 변환
In [46]:scientists=pd.read_csv('data/scientists.csv')
2.¶
앞에서 시리즈의 mean, min, max, std 메서드를 호출하여 통계 수치를 계산했던 것을 기억하나요? 통계 수치의 결괏값을 이용하여 불린 추출을 진행해 보겠습니다. 다음은 Age열을 추출하여 max, mean 메서드를 사용한 것입니다.
In [47]:ages=scientists['Age'] print(ages.max())
90
In [48]:print(ages.mean())
59.125
3.¶
이제 불린 추출을 사용할 차례입니다. 예를 들어 평균 나이보다 나이가 많은 사람의 데이터를 추출하려면 어떻게 해야 할까요? 다음 코드를 실행하면 평균 나이보다 나이가 많은 사람의 데이터만 출력됩니다.
In [49]:print(ages[ages>ages.mean()])
1 61 2 90 3 66 7 77 Name: Age, dtype: int64
4.¶
그런데 어떻게 이런일이 가능할가요? ages>ages.mean()의 결과를 출력해 보겠습니다. 그러면 1,2,3,7 인덱스의 데이터가 참이라는 것을 알 수 있습니다. 즉, 조건식을 만족한 값만 출력된 것이죠.
In [50]:print(ages > ages.mean())
0 False 1 True 2 True 3 True 4 False 5 False 6 False 7 True Name: Age, dtype: bool
5.¶
과정 3과 4를 모두 합친 코드는 다음과 같습니다. 즉, 리스트형태로 참이나 거짓을 담아 시리즈에 전달하면 참인 인덱스의 데이터만 추출할 수 있습니다. 바로 이것을 부린 추출이라고 합니다.
In [52]:manual_bool_values=[True, True, False, False, True, True, False, True] print(ages[manual_bool_values])
0 37 1 61 4 56 5 45 7 77 Name: Age, dtype: int64
시리즈와 브로드캐스팅¶
그런데 ages>ages.mean()의 결괏값의 개수가 여러 개라는 것이 이상하지 않았나요? 이렇게 시리즈나 데이터프레임에 있는 모든 데이터에 대해 한 번에 연산하는 것을 브로드캐스팅이라고 합니다. 그리고 시리즈처럼 여러 개의 값을 가진 데이터를 벡터라하고 단순 크기를 나타내는 데이터를 스칼라라고 합니다. 앞으로 벡터와 스칼라라는 용어는 자주 사용하므로 기억해 두기 바랍니다.
1.¶
다음은 같은 길이의 벡터로 더하기 연산과 곱하기 연산을 수행한 것입니다. 결괏값으로 같은 길이의 벡터가 출력됩니다.
In [53]:print(ages+ages)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
In [54]:print(ages*ages)
0 1369 1 3721 2 8100 3 4356 4 3136 5 2025 6 1681 7 5929 Name: Age, dtype: int64
2.¶
만약 벡터에 스칼라를 연산하면 어떻게 될까요? 다음은 벡터의 모든 값에 스칼라를 적용하여 브로드캐스팅한 결과입니다.
In [55]:print(ages+100)
0 137 1 161 2 190 3 166 4 156 5 145 6 141 7 177 Name: Age, dtype: int64
In [56]:print(ages*2)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
3.¶
길이가 서로 다른 벡터를 연산하면 어떻게 될까요? 시리즈와 시리즈를 연산하는 경우 같은 인덱스의 값만 계산합니다. 다음은 데이터의 개수가 2개인 시리즈와 8개인 시리즈를 더한 것입니다. 결괏값을 살펴보면 인덱스가 일치한 0,1만 계산했다는 것을 알 수 있습니다. 나머지 인덱스(2~7)는 계산 할 수 없기 때문에 누락값으로 처리합니다.
In [57]:print(pd.Series([1,100]))
0 1 1 100 dtype: int64
In [58]:print(ages+pd.Series([1,100]))
0 38.0 1 161.0 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN dtype: float64
4.¶
다음은 sort+index 메서드를 사용한 것입니다. 이때 ascending 인자로 False를 전달하여 인덱스 역순으로 데이터를 정렬했습니다.
In [59]:rev_ages=ages.sort_index(ascending=False) print(rev_ages)
7 77 6 41 5 45 4 56 3 66 2 90 1 61 0 37 Name: Age, dtype: int64
5.¶
그러면 인덱스 순서대로 정렬된 ages와 인덱스 역순으로 정렬된 rev_age를 연산하면 어떻게 될까요? ages의 데이터와 rev_ages의 데이터를 순서대로 더할 것 같지만 그렇지 않습니다. 다음은 ages2와 ages+rev_ages의 결괏값을 출력한 것입니다. 어떤가요? ages2와 ages+rev_ages의 결괏값이 동일합니다. ages의 인덱스(0~7)와 rev_ages의 인덱스가 일치하는 값끼리 연산했기 때문이죠. 벡터와 벡터의 연산은 일치하는 인덱스 값끼리 수행한다는 것을 잊지 마세요.
In [60]:print(ages*2)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
In [61]:print(ages+rev_ages)
0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
03-4 데이터프레임 다루기¶
데이터프레임도 시리즈와 마찬가지로 불린 추출과 브로드캐스팅을 할 수 있습니다. 그러면 불린 추출부터 실습해 보겠습니다.
In [62]:print(scientists[scientists['Age']>scientists['Age'].mean()])
Name Born Died Age Occupation 1 William Gosset 1876-06-13 1937-10-16 61 Statistician 2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse 3 Marie Curie 1867-11-07 1934-07-04 66 Chemist 7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician
2.¶
시리즈에 리스트로 참,거짓을 전달하여 데이터를 추출했던 것을 기억하나요? 참,거짓을 담은 리스트를 bool 벡터라고 부릅니다. 만약 bool 벤터의 길이가 데이터프레임의 행길이보다 짧으면 bool 벡터의 길이만큼만 연산합니다. 다음은 데이터프레임의 loc속성에 길이가 4인 bool벡터를 전달한 것입니다.
In [73]:print(scientists.loc[[True, True, False, True]])
--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-73-894b58968834> in <module> ----> 1 print(scientists.loc[[True, True, False, True]]) ~/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py in __getitem__(self, key) 893 894 maybe_callable = com.apply_if_callable(key, self.obj) --> 895 return self._getitem_axis(maybe_callable, axis=axis) 896 897 def _is_scalar_access(self, key: Tuple): ~/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis) 1102 return self._get_slice_axis(key, axis=axis) 1103 elif com.is_bool_indexer(key): -> 1104 return self._getbool_axis(key, axis=axis) 1105 elif is_list_like_indexer(key): 1106 ~/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py in _getbool_axis(self, key, axis) 910 # caller is responsible for ensuring non-None axis 911 labels = self.obj._get_axis(axis) --> 912 key = check_bool_indexer(labels, key) 913 inds = key.nonzero()[0] 914 return self.obj._take_with_is_copy(inds, axis=axis) ~/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py in check_bool_indexer(index, key) 2280 # key may contain nan elements, check_array_indexer needs bool array 2281 result = pd_array(result, dtype=bool) -> 2282 return check_array_indexer(index, result) 2283 2284 ~/anaconda3/lib/python3.8/site-packages/pandas/core/indexers.py in check_array_indexer(array, indexer) 483 # GH26658 484 if len(indexer) != len(array): --> 485 raise IndexError( 486 f"Boolean index has wrong length: " 487 f"{len(indexer)} instead of {len(array)}" IndexError: Boolean index has wrong length: 4 instead of 8
3.¶
데이터프레임에 스칼라 연산을 적용하면 어떻게 될까요? 앞에서 시리즈에 스칼라 연산을 적용할 때는 모든 요소에 스칼라를 적용하여 연산했습니다. 데이터프레임도 마찬가지입니다. scientists 데이터프레임에 2를 곱하면 정수 데이터는 2를 곱한 숫자가 되고 문자열 데이터는 문자열이 2배로 늘어납니다.
In [74]:print(scientists*2)
Name Born \ 0 Rosaline FranklinRosaline Franklin 1920-07-251920-07-25 1 William GossetWilliam Gosset 1876-06-131876-06-13 2 Florence NightingaleFlorence Nightingale 1820-05-121820-05-12 3 Marie CurieMarie Curie 1867-11-071867-11-07 4 Rachel CarsonRachel Carson 1907-05-271907-05-27 5 John SnowJohn Snow 1813-03-151813-03-15 6 Alan TuringAlan Turing 1912-06-231912-06-23 7 Johann GaussJohann Gauss 1777-04-301777-04-30 Died Age Occupation 0 1958-04-161958-04-16 74 ChemistChemist 1 1937-10-161937-10-16 122 StatisticianStatistician 2 1910-08-131910-08-13 180 NurseNurse 3 1934-07-041934-07-04 132 ChemistChemist 4 1964-04-141964-04-14 112 BiologistBiologist 5 1858-06-161858-06-16 90 PhysicianPhysician 6 1954-06-071954-06-07 82 Computer ScientistComputer Scientist 7 1855-02-231855-02-23 154 MathematicianMathematician
03-5 시리즈와 데이터프레임의 데이터 처리하기¶
지금까지는 시리즈와 데이터프레임에서 데이터를 추출하는 여러 방법에 대해 알아보았습니다. 이번에는 시리즈와 데이터프레임에 있는 데이터를 처리하는 방법에 대해 알아보겠습니다.
In [75]:print(scientists['Born'].dtype)
object
In [77]:print(scientists['Died'].dtype)
object
2.¶
날짜를 문자열로 저장한 데이터는 시간 관련 작업을 할 수 있도록 datetime 자료형으로 바꾸는 것이 더 좋습니다. 다음은 Born과 Died 열의 자료형을 datetime이라는 자료형으로 바꾼 다음 format 속성을 '%Y-%m-%d'로 지정하여 날짜 형식을 지정한 것입니다.
In [79]:born_datetime=pd.to_datetime(scientists['Born'#39;],format='%Y-%m-%d') print(born_datetime)
0 1920-07-25 1 1876-06-13 2 1820-05-12 3 1867-11-07 4 1907-05-27 5 1813-03-15 6 1912-06-23 7 1777-04-30 Name: Born, dtype: datetime64[ns]
In [80]:died_datetime=pd.to_datetime(scientists['Died'],format='%Y-%m-%d') print(died_datetime)
0 1958-04-16 1 1937-10-16 2 1910-08-13 3 1934-07-04 4 1964-04-14 5 1858-06-16 6 1954-06-07 7 1855-02-23 Name: Died, dtype: datetime64[ns]
3.¶
과정 2에서 각 데이터의 자료형을 datetime 으로 바꿔 born_datetime, died_datetime에 저장했으니 이제 데이터프레임에 각각의 값을 새로운 열로 추가해 보겠습니다. 다음은 scientists 데이터프레임에 born_dt, dide_dt열을 추가한 것입니다. shape 속성으로 데이터프레임의 형태를 살펴보면(8,5)에서 (8,7)로 2개의 열이 추가되었다는 것을 알 수 있습니다.
In [82]:scientists['born_dt'],scientists['died_dt']=(born_datetime, died_datetime) print(scientists.head())
Name Born Died Age Occupation born_dt \ 0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist 1920-07-25 1 William Gosset 1876-06-13 1937-10-16 61 Statistician 1876-06-13 2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse 1820-05-12 3 Marie Curie 1867-11-07 1934-07-04 66 Chemist 1867-11-07 4 Rachel Carson 1907-05-27 1964-04-14 56 Biologist 1907-05-27 died_dt 0 1958-04-16 1 1937-10-16 2 1910-08-13 3 1934-07-04 4 1964-04-14
In [83]:print(scientists.shape)
(8, 7)
4.¶
이제 시간 계산을 해볼까요? died_dt 열에서 born_dt를 빼면 과학자가 얼마 동안 세상을 살다가 떠낫는지 계산할 수 있습니다. 만약 결괏값이 제대로 출력되지 않는다면 과정 1~3을 다시 실행해 보세요
In [86]:scientists['age_days_dt']=(scientists['died_dt'] - scientists['born_dt']) print(scientists)
Name Born Died Age Occupation \ 0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist 1 William Gosset 1876-06-13 1937-10-16 61 Statistician 2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse 3 Marie Curie 1867-11-07 1934-07-04 66 Chemist 4 Rachel Carson 1907-05-27 1964-04-14 56 Biologist 5 John Snow 1813-03-15 1858-06-16 45 Physician 6 Alan Turing 1912-06-23 1954-06-07 41 Computer Scientist 7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician born_dt died_dt age_days_dt 0 1920-07-25 1958-04-16 13779 days 1 1876-06-13 1937-10-16 22404 days 2 1820-05-12 1910-08-13 32964 days 3 1867-11-07 1934-07-04 24345 days 4 1907-05-27 1964-04-14 20777 days 5 1813-03-15 1858-06-16 16529 days 6 1912-06-23 1954-06-07 15324 days 7 1777-04-30 1855-02-23 28422 days
5. 시리즈, 데이터프레임의 데이터 섞기¶
가끔은 데이터를 적당히 섞어야 하는 경우도 있습니다. 판다스는 시리즈나 데이터프레임의 데이터를 무작위로 섞어볼 수도 있습니다. 먼저 Age 값을 출력하여 살펴보겠습니다.
In [87]:print(scientists['Age'])
0 37 1 61 2 90 3 66 4 56 5 45 6 41 7 77 Name: Age, dtype: int64
6.¶
Age 열의 데이터를 섞으려면 random 라이브러리를 불러와야 합니다. random 라이브러리에는 데이터를 섞어주는 shuffle 메서드가 있습니다. shuffle 메서드에 Age열을 전달하여 데이터를 섞어보겠습니다. Age 열을 출력해 보면 인덱스 0~7에 해당하는 값이 잘섞여 있음을 알 수 있습니다.
In [88]:import random random.seed(42) random.shuffle(scientists['Age']) print(scientists['Age'])
0 66 1 56 2 41 3 77 4 90 5 45 6 37 7 61 Name: Age, dtype: int64
/home/dmlrkd67/anaconda3/lib/python3.8/random.py:307: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy x[i], x[j] = x[j], x[i]
7.¶
때로는 열을 통째로 삭제해야 하는 경우도 있습니다. 먼저 scientists 데이터프레임의 열을 확인해 보겠습니다.
In [89]:print(scientists.columns)
Index(['Name', 'Born', 'Died', 'Age', 'Occupation', 'born_dt', 'died_dt', 'age_days_dt'], dtype='object')
8.¶
데이터프레임에서 열을 삭제하려면 데이터프레임의 drop 메서드를 사용해야 합니다. shuffle 메서드로 섞은 Age 열을 삭제해 보겠습니다. drop 메서드의 첫 번째 인자에 열 이름을 리스트에 담아 전달하고 두 번째 인자에는 axis=1을 전달하면 Age열을 삭제할 수 있습니다.
In [91]:scientists_dropped=scientists.drop(['Age'],axis=1) print(scientists_dropped.columns)
Index(['Name', 'Born', 'Died', 'Occupation', 'born_dt', 'died_dt', 'age_days_dt'], dtype='object')
03-6 데이터 저장하고 불러오기¶
지금까지 데이터를 추출하고 처리하는 방법에 대해 알아보았습니다. 일종의 '데이터 가공처리'를 거친 것이죠. 이렇게 잘 가공한 데이터는 안전하게 보관해야 다음에 또 사용할 수 있습니다. 판다스는 데이터를 저장하는 다양한 방법을 제공합니다. 여기서는 가공한 데이터를 피클, CSV,TSV 파일로 저장하고 다시 불러오는 방법에 대해 살펴보겠습니다.
In [103]:names=scientists['Name'] names.to_pickle('output/scientists_names_series.pickle')
2.¶
데이터프레임도 피클로 저장할 수 있습니다.
In [104]:scientists.to_pickle('output/scientists_df.pickle')
3.¶
피클은 바이너리 형태의 오브젝트이기 때문에 저장된 피클 데이터를 편집기와 같은 프로그램으로 열어보면 이상한 문자가 나타납니다. 피클 데이터는 반드시 read_pickle 메서드로 읽어 들여야 합니다.
In [115]:scientist_names_from_pickle=pd.read_pickle('output/scientists_names_series.pickle') print(scientist_names_from_pickle)
0 Rosaline Franklin 1 William Gosset 2 Florence Nightingale 3 Marie Curie 4 Rachel Carson 5 John Snow 6 Alan Turing 7 Johann Gauss Name: Name, dtype: object
4.CSV 파일과 TSV 파일로 저장하기¶
CSV 파일은 데이터를 쉽표로 구분하여 저장한 파일이고 TSV 파일은 데이터를 탭으로 구분하여 저장한 파일입니다. 실제로 각각의 파일을 텍스트 편집기로 열어 살펴보면 데이터가 쉽표, 탭으로 구분되어 있는 것을 알 수 있습니다. 다음은 data 폴더의 'concat_1.csv'파일과 'gapminder.tsv'파일을 비주얼 스튜디오 코드라는 텍스트 편집기로 열어 살펴본것입니다. 비주얼 스튜디오 코드가 없다면 여러분의 컴퓨터에 설치된 텍스트 편집기로 파일을 열어보세요.
5.¶
to_csv 메서드로 시리즈와 데이터프레임을 CSV 파일로 저장할 수 있습니다. 이때 sep 인자를 추가하여 '\t'를 지정하고 파일의 확장자를 '.tsv'로 지정하면 TSV 파일로 저장할 수 있습니다.
In [117]:names.to_csv('output/scientist_names_series.csv') scientists.to_csv('output/scientists_df.tsv',sep = '\t')
마무리하며¶
이 장에서는 시리즈와 데이터프레임을 좀 더 자세히 다루어 보았습니다. 다음 장부터는 파이썬과 판다스로 그래프를 그리기 위한 기초 개념을 살펴봅니다. 데이터 분석에서 가장 중요한 요소 중 하나인 데이터 시각화에 대한 내용이 시작되는 것이죠. 만약 02,03장을 완벽하게 이해하지 못했다면 다시 공부하고 04장을 시작하세요.
출처 : "do it 데이터 분석을 위한 판다스 입문"
'판다스' 카테고리의 다른 글
chapter-7 깔끔한 데이터 (0) 2021.09.23 chapter-6 누락값 처리하기 (0) 2021.09.23 chapter-5 데이터 연결하기 (0) 2021.09.17 chapter-4 그래프 그리기 (0) 2021.09.17 chapter-2 판다스 시작하기 (0) 2021.09.14