본문 바로가기
DS/데이터-PANDAS

PANDAS ST0 판다스,Series,DataFrame.

by 시에라177 2022. 5. 17.

#0.PANDAS란

-파이썬환경에서 데이터프레임을 제공하고, 파이썬언어로 데이터프레임 상의 데이터를 다루고 통계처리를 가능케 해주는 라이브러리.

-단순화해 말하자면 파이썬 상의 엑셀. 파이썬 상의 SQL 데이터베이스 등으로 생각하면 된다. 나는 판다스가 SQL보다 훨씬 직관적이고 명료화 되어 있다고 느꼈다.

-컴활 공부를 해봤거나 SQLD(P)를 준비해봤다거나 한다면 개념화하는데 수월할 듯 하다.

-데이터 관련 공부를 해보니 판다스를 모르면 안됨. (PANDAS, NUMPY, MATPLOTLIB은 필수)

 

#1.PANDAS의 기능/특징

*1-1 해당 데이터 타입에 상관없이 결측 데이터를 쉽게 처리할 수 있다. (실제 데이터셋을 보면 부분 부분 빠진 데이터가 있는데 판다스로 이런 결측데이터를 쉽게 처리할 수 있다.)

*1-2 데이터 셋의 형태를 쉽게 다룰 수 있다. 특정한 행과 열을 쉽게 빼거나 더할 수 있다. 결합/분할 용이.

*1-3 데이터 정렬을 자의적으로 조정할 수 있다. 특정 데이터 속성(열)을 기준으로 정렬할 수 있다.

*1-4 데이터의 술통계(집계)에 관한 기능들을 제공한다

*1-5 그룹바이가 가능하다. (그룹별로 묶어 집계하는 방식)

*1-6 다른 데이터 구조에서 판다스 데이터프레임구조로 변환이 자유롭고, 그 반대도 그러함. (ex. csv파일은 ;으로 열을 구분하는데 이 csv파일을 엑셀로 변환하면 ;을 포함해 한 데이터의 모든 속성이 한 셀에 들어옴..., 그렇기 때문에 csv파일을 ;기준으로 판다스 데이터프레임으로 변환한뒤 다시 xlsx파일로 변환하면 정상적인 데이터셋의 형태를 갖추게 됨.)(사실 엑셀에 ;을 기준으로 셀을 나누는 자체기능이 있는 것으로 알고있음..)

*1-7 시계열 데이터 다루기가 쉽다.

 

#2. PANDAS vs NUMPY

(사실 판다스는 넘파이 기반으로 만들어진 데이터베이스 셋이다.)

-판다스는 데이터테이블을 처리하고 가공하는데 기능이 특화된 라이브러리. (그냥 내가 볼땐 sql이다)

-넘파이는 벡터/선형대수연산, 다차원배열(ndarray)기능을 제공하는 것에 특화된 라이브러리이다. 그래서 굳이 따지자면 넘파이는 데이터테이블을 다루는 라이브러리는 아니다.

-그렇기 때문에 판다스는 서로다른 데이터 타입들을 담을 수 있고, 넘파이는 불가능. 데이터타입이 다르면 선형대수 연산에 문제가 생기니까.

 

#3.PANDAS 객체

판다스는 크게 Series Data Frame객체(혹은 자료구조)로 이루어짐.

*3-1 Series

판다스에서 1차원 데이터구조를 다룰 때 사용. 

시리즈 자료형은 백터화연산이 가능하다.

라벨 : 인덱스에 이름을 붙일 수 있고 이 이름을 라벨이라고함. 혹은 인덱스의 값을 라벨이라함.딕셔너리와 비슷. 

라벨이 있더라도 인덱스로 슬라이싱/인덱싱가능.  딕셔너리와 비슷하고 실제로 dict를 시리즈로 바꾸면 키값이 라벨로 자동으로 적용됨.

#series객체
s_0 = pd.Series([1, 0.2, 0.3, 4, 5])
print(s_0)
>>>
0    1.0
1    0.2
2    0.3
3    4.0
4    5.0
dtype: float64

print(type(s_0))  #판다스.시리즈 객체의 타입은?
>>>
<class 'pandas.core.series.Series'>

print(s_0.values) #시리즈의 값들
>>>
[1.  0.2 0.3 4.  5. ]

print(s_0.index)  #시리즈의 인덱스들
>>>
RangeIndex(start=0, stop=5, step=1) #디폴트

print(s_0[1:3])   #판다스 시리즈의 슬라이싱
>>>
1    0.2
2    0.3
dtype: float64

 

#라벨은 range가 디폴트.
s_0 = pd.Series([1, 0.2, 0.3, 4, 5], index = ['q', 'w', 'e', 'r', 'd'])
print(s_0)
>>>
q    1.0
w    0.2
e    0.3
r    4.0
d    5.0
dtype: float64

print(s_0['q': 'e']) #range슬라이싱과 다르다.
>>>
q    1.0
w    0.2
e    0.3
dtype: float64

print(s_0[1: 4]) #인덱스로 슬라이싱 가능.
>>>
w    0.2
e    0.3
r    4.0
dtype: float64
#고유한 값들만 출력해줌.
print(s_0.unique())
>>
[1.  0.2 0.3 4.  5. ]

#각 데이터들의 속성(값)들의 총개수
print(s_0.value_counts())
>>>
1.0    1
0.2    1
0.3    1
4.0    1
5.0    1
dtype: int64

print(s_0.isin([0.3, 6]))
>>>
q    False
w    False
e     True
r    False
d    False
dtype: bool  #데이터타입 : bool


#딕셔너리 시리즈로 변환. 키값들은 자동 라벨화.
pp_dict = {"서울_특별시" : 80000000,
          "부산_광역시" : 35000000,
          "대구_광역시" : 25000000,
          "인천_광역시" : 25000000}

pp_ser = pd.Series(pp_dict)
print(pp_ser)

>>>
서울_특별시    80000000
부산_광역시    35000000
대구_광역시    25000000
인천_광역시    25000000
dtype: int64

*3-2 DataFrame

데이터프레임 객체는 행과 열을 가진 2차원 배열구조(테이블)이다.

파이썬으로 만들 수도 있고 csv파일이나 엑셀파일을 불러와 만들 수 도 있다.

행은 각각의 데이터이고 열은 해당 데이터의 속성이다.

데이터프레임 객체도 열에 라벨(이름)을 붙일 수 있고 행 인덱스에 라벨를 설정할 수 있다.

*딕셔너리로 데이터프레임을 만들 때 key값은 반드시 열이 된다.(딕셔너리 벨류안에 딕셔너리가 있으면?? 당연히 안쪽 딕셔너리 key값은 열이 될 수 없으니 행의 인덱스가 된다.)

#1
#딕셔너리로 데이터프레임을 만들면 키값은 열 이름으로 벨류값은 값으로 들어감.
df_0 = pd.DataFrame([{'A' : 1, 'B' : 2, 'D' :3}, {'A' :1, 'B' : 2, 'C' :3}])
print(df_0)
#비어 있는 누락값은 NaN으로 들어감. 판다스는 누락값 처리에 강함.
>>>
   A  B    D    C
0  1  2  3.0  NaN
1  1  2  NaN  3.0


#2
df_1 = pd.DataFrame({'num' : [1,2,3,4],
        '국가': ['미국', '일본', '한국', '영국'],
        '환율':[1200, 100, 1000,1500],
        '공항': ['시카고','하네다','인천', '히드로']})
print(df_1)
>>>
   num  국가    환율   공항
0    1  미국  1200  시카고
1    2  일본   100  하네다
2    3  한국  1000   인천
3    4  영국  1500  히드로


#3
pp_all_dict = {"서울_특별시" : 80000000,
          "부산_광역시" : 35000000,
          "대구_광역시" : 25000000,
          "인천_광역시" : 25000000}

pp_male_dict = {"서울_특별시" : 40000000,
          "부산_광역시" : 20000000,
          "대구_광역시" : 15000000,
          "인천_광역시" : 15000000}

pp_female_dict = {"서울_특별시" : 40000000,
          "부산_광역시" : 15000000,
          "대구_광역시" : 10000000,
          "인천_광역시" : 10000000}

population_k = pd.DataFrame({'인구수' : pp_all_dict,
                    '남성' : pp_male_dict,
                    '여성' : pp_female_dict})
print(population_k)
>>>
             인구수        남성        여성
서울_특별시  80000000  40000000  40000000
부산_광역시  35000000  20000000  15000000
대구_광역시  25000000  15000000  10000000
인천_광역시  25000000  15000000  10000000

print(population_k.index)
print(population_k.columns)
>>>
Index(['서울_특별시', '부산_광역시', '대구_광역시', '인천_광역시'], dtype='object')
Index(['인구수', '남성', '여성'], dtype='object')

print(population_k['남성']) #남성의 인구수만 출력
>>>
서울_특별시    40000000
부산_광역시    20000000
대구_광역시    15000000
인천_광역시    15000000
Name: 남성, dtype: int64