Python/Python Language

Pandas(판다스) 1차원 2차원 생성과 데이터 정리

567Rabbit 2024. 4. 5. 18:00
  • Pandas [Panel Data + Python Data Analysis]
  • NumPy and Matplotlib를 통합한 것이다
  • 데이터셋들을 merge(병합) 할 수 있습니다 
  • 기본적인 통계데이터 제공
  • NaN values 를 알아서 처리합니다
  • 숫자 문자열을 알아서 로드합니다
  • 데이터를 분석하는 데 사용합니다
  • 지저분한 데이터세트를 정리하여 읽기 쉽고 관련성있게 만듭니다
  • 고급 => 상관관계, 플로팅

 

 

설치 pip install pandas

 

판다스의 1차원 데이터를 => 시리즈(Serise)라고 부릅니다

판다스의 2차원 데이터를 = > 데이터프레임(DataFrame)이라고 부릅니다

 

 

1차원 데이터 : 시리즈 (Serise)

 

x = pd.Series(data = data, index = index)

eggs       30
apples      6
milk      Yes
bread      No
dtype: object

 

x.values

array([30, 6, 'Yes', 'No'], dtype=object)

 

x.index

Index(['eggs', 'apples', 'milk', 'bread'], dtype='object')

 

x.ndim #차원 알아보기

1

 

 

x[['eggs','bread']] #두 개 이상의 데이터 가져올 때(access할 때)는 []묶음처리한다

eggs     30
bread    No
dtype: object

 

 

x[1:3+1] #슬라이싱

apples      6
milk      Yes
bread      No
dtype: object

 

x['apples' : 'bread'] #슬라이싱

apples      6
milk      Yes
bread      No
dtype: object

 

 

2차원 데이터 : 데이터프레임(DataFrame)


판다스의 2차원 데이터 처리는 데이터 프레임으로 한다. (DataFrame)
실제 데이터 분석에서는 csv 파일을 판다스의 데이터 프레임으로 읽어와서 작업한다

 

df.describe()

: count , mean, std, min, max 등의 정보를 알려준다

 

items = {'Bob' : pd.Series(data = [245, 25, 55], index = ['bike', 'pants', 'watch']),
         'Alice' : pd.Series(data = [40, 110, 500, 45], index = ['book', 'glasses', 'bike', 'pants'])}

  Bob Alice
bike 245.0 500.0
book NaN 40.0
glasses NaN 110.0
pants 25.0 45.0
watch 55.0 NaN

 

왼쪽의 진한글씨 : index 
위쪽의 진한 글씨 : coulmns
안쪽에 위치한 데이터 : values

 

 

새로운 Column 생성하기, 컬럼명 변경하기

 

# 새로운 컬럼 name을 만들되, 데이터는 A,B,C라고 넣자.

  bike pants shirts suits
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

df['name'] = ['A' , 'B' , 'C']

df

  bike pants shirts suits name
store 1 20 30 15.0 45.0 A
store 2 15 5 2.0 7.0 B
store 3 20 30 NaN NaN C

 

 

 

# 컬럼명 변경. bikes => hat, suits => shoes

  bike pants shirts suits
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

 

df.rename ( columns= { 'bikes' : 'hat' , 'suits' : 'shoes' } ,inplace = True)

  hat pants shirts shoes
store 1 20 30 15.0 45.0
store 2 15 5 2.0 7.0
store 3 20 30 NaN NaN

 

 

 

 

데이터 가져오기 (Access)

 

"데이터 프레임"에서 원하는 데이터를 access 하는 방법
# 1. 컬럼의 데이터를 가져오는 방법 : 변수명 바로 오른쪽에 대괄호 사용!
# 2. 행과 열의 정보로, 원하는 데이터를 가져오는 방법 (1)   .loc[ , ]로 가져오는 방법 - 이 방법은 사람용인 인덱스와 컬럼으로 데이터를 access하는 방법이다
# 3. 행과 열의 정보로, 데이터를 가져오는 방법(2)  .iloc[ , ]로 가져오는 방법 - 컴퓨터가 매기는 인덱스(offset)로 데이터를 access하는 방법이다

 

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 10 50.0

 

 

df['watches']

store 1    35
store 2    10
Name: watches, dtype: int64

 

 

 

#바이크랑 와치 컬럼 두개를 한번에 가져오시오

df[['bikes','watches']]  #두 개 이상의 데이터는 [ , ]로 묶어줘야 한다

 

  bikes  watches
store 1 20 35
store 2 15 10

 

 

# 스토어 1의 팬츠 데이터를 가져오시오

df.loc['store 1','pants']

30

 

 

# 스토어 2의 바이크, 팬츠 데이터를 가져오시오

df.loc['store 2',['bikes','watches']]

bikes      15.0
watches    10.0
Name: store 2, dtype: float64

 

 

# 스토어 2에서, pants부터 glasses까지 데이터를 가져오시오

df.loc['store 2','pants':'glasses']

pants       5.0
watches    10.0
glasses    50.0
Name: store 2, dtype: float64

 

 

# 스토어 1에서 pants 데이터를 가져오시오

df.iloc [ 0, 1 ]

30

 

 

# 스토어 2의 bikes와 watches 데이터를 가져오시오

df.iloc[ 1 , [0,2] ]

bikes      15.0
watches    10.0
Name: store 2, dtype: float64

 

 

이터정리

 

:  데이터 세트의 잘못된 데이터를 수정하는 것을 의미한다

=>빈 셀 청소, 잘못된 형식의 데이터 정리, 오류 데이터 정리(또는 데이터 값 변경), 중복제거(drop_duplicates)

 

 

(1) 빈 셀 청소

 

: 데이터를 분석할때 빈 셀은 잠재적으로 잘못된 결과를 제공할 수 있다

 

공백 개수 구하기

df.isna().sum()       #컬럼별로 nan개수가 더해진다

df.isna().sum().sum()     #전체 nan개수를 계산해준다

 

 

빈 셀이 포함된 행을 제거 :    df.dropna() : nan이 들어가있는 행을 삭제해준다

빈 셀을 채우기 :               df.fillna(0)  : 0으로 채우기

                                       df.fillna("a") : 문자열(a)로 채우기

  bikes   pants   watches  shirts    shoes   suits  glassess
store 1 20 30 35 15.0 8 45.0 NaN
store 2       15 5 10 2.0 5 7.0 50.0
store 3 20 30 35 NaN 10 NaN 4.0

 

 

# nan이 들어간 행을 삭제

df.dropna()

  bikes   pants   watches  shirts    shoes   suits  glassess
store 2   15   5            10       2.0       5    7.0    50.0

 

 

 

# 0으로 채우기

df.fillna(0)

  bikes   pants   watches  shirts    shoes   suits  glassess
store 1         20    30         35   15.0             8        45.0     0.0
store 2         15     5      10                2.0             5     7.0    50.0
store 3         20    30      35                0.0            10    0.0    4.0

 

 

 

# 평균값으로 채우기

df.fillna(df.mean())

  bikes   pants   watches  shirts    shoes         suits  glassess
store 1         20           30                 35             15.0             8                 45.0                 27.0
store 2         15             5                 10               2.0             5                   7.0                 50.0
store 3         20           30                 35               8.5            10                 26.0                  4.0

 

 

 

#numeric_only=True는 숫자데이터의 값만 계산한다

  Book Title Author User1 User2 User3 User4
0 Great Expectations Charles Dickens 3.2 5.0 2.0 4.0
1 Of Mice and Men 
John Steinbeck NaN 1.3 2.3 3.5
2 Romeo and Juliet William Shakespeare  2.5 4.0 NaN 4.0
3 The Time Machine H. G. Wells NaN 3.8 4.0 5.0
4 Alice in Wonderland Lewis Carroll NaN NaN NaN 4.2

 

 

df.fillna(df.mean(numeric_only=True)) 

  Book Title Author User1 User2 User3 User4
0 Great Expectations Charles Dickens 3.2 5.0 2.0 4.0
1 Of Mice and Men
John Steinbeck 2.85 1.3 2.3 3.5
2 Romeo and Juliet William Shakespeare 2.5 4.0 2.766667 4.0
3 The Time Machine H. G. Wells 2.85 3.8 4.0 5.0
4 Alice in Wonderland Lewis Carroll 2.85 3.525 2.766667 4.2

 

 

 

(2) 잘못된 형식의 데이터 정리

- 데이터의 형식을 알맞게 바꿔준다

 

 


(3) 데이터 오류 정리 또는 데이터 값 변경하기

Replacing Values
Removing Rows

 

# 스토어 2의 watches 데이터를, 20으로 변경해 주세요

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 10 50.0

 

df.loc['store 2','watches'] = 20

df

  bikes  pants  watches glasses 
store 1 20 30 35 NaN
store 2 15 5 20 50.0

 

-----------------------------------------------------------------------------------------------------------------------------------

데이터를 정리하는게 아니라, null 없이 데이터를 access하고 싶다면

.notna를 가져온다

 

null인지 확인하고 싶다면

.isna()

 

열별로 null의 개수를 확인하고싶다면

.isna().sum()

 

총 null의 개수를 확인하고싶다면

.isna().sum().sum()

--------------------------------------------------------------------------------------------------------------------------------------

 

# 데이터를 삭제하는 방법
- 행 삭제, 열 삭제
- drop()함수를 이용하고, axis만 설정해주면 된다

 

df.drop('watches', axis=1)

  bikes  pants  glasses 
store 1 20 30 NaN
store 2 15 5 50.0

 

df.drop('store 2' , axis=0)

  bikes  pants  watches glasses 
store 1 20 30 35 NaN

 


(4) 중복 제거
(drop_duplicates)

 

                 Year             Name        Department          Age            Salary
0              1990               Alice                HR                25               50000
1              1990               Bob                 RD                30                48000
2              1990              Charlie             Admin           45                55000
3              1991               Alice               HR                 26                52000
4              1991               Bob                 RD                31                50000
5              1991               Charlie            Admin           46                60000
6              1992               Alice               HR                 27                60000
7              1992               Bob                RD                 32                52000
8              1992               Charlie           Admin            47                62000

 

 

< 카테고리컬 데이터 (Categorical Data) >

-중복이 발생하는 데이터
-유니크한 데이터를 활용해야한다
-카테고리컬 데이터의 경우, 데이터 분석시 데이터별로 묶어서 데이터를 분석할 수 있다

 

df4['Department'].unique()

array(['HR', 'RD', 'Admin'], dtype=object)

 

df4['Year'].unique()

array([1990, 1991, 1992], dtype=int64)

 

df4['Year'].nunique()

3

 

 

 

데이터 묶어서 처리하기  .groupby()

 

- 각 년도별로, 지급한 연봉 총합을 구하라.

df4.groupby('Year')['Salary'].sum()

Year
1990    153000
1991    162000
1992    174000
Name: Salary, dtype: int64

 

* df4.groupby('Year')['Salary'].count()하면, 데이터가 몇 개인지 알 수 있다.

 

 

몇 개가 중복되었는지 알아보기

 

# Name 컬럼은, 각 이름별로 몇개의 데이터가 있을까?

df4.groupby('Name')['Name'].count()

Name
Alice      3
Bob        3
Charlie    3
Name: Name, dtype: int64

 

df4['Name'].value_counts

Name
Alice      3
Bob        3
Charlie    3
Name: count, dtype: int64