- 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
#바이크랑 와치 컬럼 두개를 한번에 가져오시오
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
'Python > Python Language' 카테고리의 다른 글
데이터프레임(DataFrame)의 column, index 설정 방법 (0) | 2024.04.09 |
---|---|
Pandas에서 제공하는 문자열(Str) 함수 (2) | 2024.04.09 |
Python(파이썬) 함수 def 사용하기 (0) | 2024.04.04 |
조건문 (if, elif, else) 작성하기 (0) | 2024.04.04 |
Python 반복문(for, while) 작성하기 (0) | 2024.04.04 |