HappyWeasel
파이썬 - Pandas 1 본문
구조화된 데이터를 효과적으로 처리하고 저장할 수 있는 파이썬 라이브러리.
Array 계산에 특화된 numpy를 기반으로 만들어져서 다양한 기능들을 제공한다.
Series
- numpy array가 보강된 형태 Data와 Index를 가지고 있다.
- 즉, numpy array에 없는 index가 추가 된 것이다.
import pandas as pd
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
data['b']
# 2
# index가 정수가 아닐 수도 있다.
- 딕셔너리로 만들 수 있다.
population_dict= {
'korea': 5180,
'japan': 12718,
'china': 141500,
'usa': 32676
}
population = pd.Series(population_dict)
# key가 index가 되고 value가 data가 된다.
population.values()
# numpy array로 데이터 출력
DataFrame
- 여러 개의 Series가 모여서 행과 열을 이룬 데이터
import pandas as pd
population_dict = {
'china': 141500,
'japan': 12718,
'korea': 5180,
'usa': 32676
}
population = pd.Series(population_dict)
gdp_dict = {
'china' : 1409250000,
'korea' : 169320000,
'japan' : 516700000,
'usa' : 2041280000
}
gdp = pd.Series(gdp_dict)
country = pd.DataFrame({
'population' : population,
'gdp' : gdp
})
print(country)
'''
population gdp
china 141500 1409250000
japan 12718 516700000
korea 5180 169320000
usa 32676 2041280000
'''
print(country.index)
'''
Index(['china', 'japan', 'korea', 'usa'], dtype='object')
'''
print(country.columns)
'''
Index(['population', 'gdp'], dtype='object')
'''
print(country['gdp'])
'''
china 1409250000
japan 516700000
korea 169320000
usa 2041280000
Name: gdp, dtype: int64
'''
print(type(country['gdp']))
'''
<class 'pandas.core.series.Series'>
'''
- Series도 numpy array처럼 연산자를 사용할 수 있다.
gdp_per_capita = country['gdp'] / country['population']
country['gdp per capita'] = gdp_per_capita
print(country)
'''
population gdp gdp per capita
china 141500 1409250000 9959.363958
japan 12718 516700000 40627.457147
korea 5180 169320000 32687.258687
usa 32676 2041280000 62470.314604
'''
저장과 불러오기
- 만든 DataFrame을 저장 및 불러 올 수 있다.
# 저장하기
country.to_csv('./country.csv')
country.to_excel('./country.xlsx')
# 불러오기
country = pd.read_csv('./country.csv')
country = pd.read_excel('./country.xlsx')
Indexing / Slicing
- loc : 명시적인 인덱스를 참조하는 인덱싱/슬라이싱
print(country.loc['china'])
'''
population 1.415000e+05
gdp 1.409250e+09
gdp per capita 9.959364e+03
Name: china, dtype: float64
'''
print(country.loc['japan':'korea', :'population'])
'''
population
japan 12718
korea 5180
'''
- iloc : 파이썬 스타일 정수 인덱스 익덱싱/슬라이싱
print(country.loc['china'])
"""
population 1.415000e+05
gdp 1.409250e+09
gdp per capita 9.959364e+03
Name: china, dtype: float64
"""
print(country.loc['japan':'korea', :'population'])
"""
japan 40627.457147
korea 32687.258687
Name: gdp per capita, dtype: float64
"""
DataFrame
- 새 데이터 추가/수정
- 리스트로 추가하는 방법과 딕셔너리로 추가하는 방법
dataframe = pd.DataFrame(columns=['이름', '나이', '주소'])
dataframe.loc[0] = ['홍길동', '99', '서울']
dataframe.loc[1] = {'이름':'철수', '나이':'25', '주소':'인천'}
print(dataframe)
'''
이름 나이 주소
0 홍길동 99 서울
1 철수 25 인천
'''
dataframe.loc[1, '이름'] = '영희'
print(dataframe)
'''
이름 나이 주소
0 홍길동 99 서울
1 영희 25 인천
'''
- 새로운 컬럼 추가
dataframe['전화번호'] = np.nan
# nan = Not a Number
dataframe.loc[0, '전화번호'] = '0100000000'
print(dataframe)
'''
이름 나이 주소 전화번호
0 홍길동 99 서울 0100000000
1 영희 25 인천 NaN
'''
print(len(dataframe))
'''
2
'''
- 컬럼 선택하기
- 컬럼 이름이 하나만 있따면 Series 리스트로 들어가 있다면 DataFrame
print(dataframe["이름"])
# 이름 컬럼만 출력
'''
0 홍길동
1 영희
Name: 이름, dtype: object
'''
print(dataframe[["이름", "주소", "나이"]])
# 이름, 주소, 나이 컬럼만 출력, 대괄호가 하나 더 추가된다.
'''
0 홍길동 서울 99
1 영희 인천 25
'''
- 누락된 데이터 체크
- Nan 또는 none 데이터를 체크한다.
print(dataframe.isnull())
'''
이름 나이 주소 전화번호
0 False False False False
1 False False False True
'''
print(dataframe.notnull())
'''
이름 나이 주소 전화번호
0 True True True True
1 True True True False
'''
print(dataframe.dropna())
# 비어있는 데이터는 출력하지 않는다.
'''
이름 나이 주소 전화번호
0 홍길동 99 서울 0100000000
1 영희 25 인천 NaN
dropna() 사용 후
이름 나이 주소 전화번호
0 홍길동 99 서울 0100000000
'''
dataframe['전화번호'] = dataframe['전화번호'].fillna('전화번호 없음')
# 전화번호 컬럼에 비어있는 데이터가 있으면 '전화번호 없음'으로 채워넣는다.
print(dataframe)
'''
이름 나이 주소 전화번호
0 홍길동 99 서울 0100000000
1 영희 25 인천 전화번호 없음
'''
Series 연산
- numpy array에서 사용했던 연산자들을 활용할 수 있다.
A = pd.Series([2, 4, 6], index=[0,1,2])
B = pd.Series([1, 3, 5], index=[1,2,3])
print(A)
'''
0 2
1 4
2 6
dtype: int64
'''
print(B)
'''
1 1
2 3
3 5
dtype: int64
'''
print(A+B)
# A는 0인 인덱스가 있지만 B는 없으므로 NaN이 뜬다.
'''
0 NaN
1 5.0
2 9.0
3 NaN
dtype: float64
'''
print(A.add(B, fill_value=0))
# A+B 일때 NaN이 뜨는 것을 방지하기 위해서 NaN을 0으로 변경 후 덧셈을 실행
'''
0 2.0
1 5.0
2 9.0
3 5.0
dtype: float64
'''
DataFrame 연산
A = pd.DataFrame(np.random.randint(0,10, (2,2)), columns=list("AB"))
B = pd.DataFrame(np.random.randint(0,10, (3,3,)), columns=list("BAC"))
print(A)
'''
A B
0 9 3
1 4 5
'''
print(B)
'''
B A C
0 0 0 0
1 8 5 4
2 3 2 5
'''
print(A+B)
'''
A B C
0 9.0 3.0 NaN
1 9.0 13.0 NaN
2 NaN NaN NaN
'''
print(A.add(B, fill_value=0))
'''
A B C
0 9.0 3.0 0.0
1 9.0 13.0 4.0
2 2.0 3.0 5.0
'''
집계함수
- numpy array에서 사용했던 sum, mean 등을 활용할 수 있다.
data = {
'A' : [ i+5 for i in range(3)],
'B' : [ i**2 for i in range(3)]
}
print(data['A'])
"""
[5, 6, 7]
"""
print(data['B'])
"""
[0, 1, 4]
"""
df = pd.DataFrame(data)
print(df['A'].sum())
"""
8
"""
print(df.sum())
"""
A 18
B 5
dtype: int64
"""
print(df.mean)
"""
<bound method DataFrame.mean of A B
0 5 0
1 6 1
2 7 4>
"""
정렬
df = pd.DataFrame({
'col1' : [2, 1, 9, 8, 7, 4],
'col2' : ['A', 'A', 'B', np.nan, 'D', 'C'],
'col3' : [0, 1, 9, 4, 2, 3]
})
print(df)
'''
col1 col2 col3
0 2 A 0
1 1 A 1
2 9 B 9
3 8 NaN 4
4 7 D 2
5 4 C 3
'''
print(df.sort_values('col1'))
# col1의 값을 기준으로 오름차순 정렬(디폴트이다.)
'''
col1 col2 col3
1 1 A 1
0 2 A 0
5 4 C 3
4 7 D 2
3 8 NaN 4
2 9 B 9
'''
print(df.sort_values('col1', ascending=False))
# ascending=False 내림차순으로 정렬 (ascending=True가 디폴트이다.)
'''
col1 col2 col3
2 9 B 9
3 8 NaN 4
4 7 D 2
5 4 C 3
0 2 A 0
1 1 A 1
'''
print(df.sort_values(['col2', 'col1']))
# col2를 먼저 정렬 후 col1 정렬 / [] 괄호 안에 조건을 넣는다.
'''
col1 col2 col3
1 1 A 1
0 2 A 0
2 9 B 9
5 4 C 3
4 7 D 2
3 8 NaN 4
'''
'Basic > Python' 카테고리의 다른 글
파이썬 - Pandas 2 (1) | 2020.06.29 |
---|---|
파이썬 - Numpy (0) | 2020.06.05 |
파이썬 - filter (0) | 2020.06.05 |
파이썬 - map (0) | 2020.06.05 |
파이썬 - lambda (0) | 2020.06.04 |
Comments