- 구조화된 데이터를 효과적으로 처리하고 저장할 수 있는 파이썬 라이브러리
- numpy를 기반으로 만들어져 다양한 기능 제공함
import pandas as pd
data = pd.Series([1, 2, 3, 4])
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
population_dict = {"a": 1, "b":2}
population = pd.Series(population_dict)
# 데이터가 numpy 객체로 이루어져 있다.
gdp_dict = {"a": 1, "b":2}
gdp = pd.Seires(gdp_dict)
population_dict = {"a": 1, "b":2}
population = pd.Series(population_dict)
country = pd.DataFrame({'population': population, 'gdp': gdp})
👉 인덱스 확인하기
country.index # Index(['china', 'japan', ...])
👉 컬럼 확인하기
country.columns # Index(['gdp', 'population', ...], dtype='object')
👉 원하는 컬럼만 뽑기
country['gdp']
type(country['gdp'])
1. DataFrame의 Series 연산하기
# 나누기 연산
gdp_per_capita = country['gdp'] / country['population]
# 컬럼 추가
country['gdp per capita'] = gdp_per_capita
2. 저장과 불러오기
country.to_csv("./country.csv")
country.to_excel("country.xlsx")
country = pd.read_csv("./country.csv")
country = pd.read_excel("./country.xlsx")
country.loc['china']
country.loc['japan':'korea', :'population']
country.iloc[0]
country.iloc[1:3, :2]
df = pd.DataFrame(columns=['이름', '나이', '주소']
# 리스트로 추가하기
df.loc[0] = ['철수', '20', '서울']
# 딕셔너리로 추가하기
df.loc[1] = {'이름': '영희', '나이': '30', '주소': 경기}
# 수정하기
df.loc[1, '이름'] = '철희'
df['전화번호'] = np.nan # NaN을 가진 열이 추가됨
len(df) # '행'의 길이
df['이름'] # series가 출력됨
df[['이름', '주소', '나이']] # dataframe이 출력됨
df.isnull() # 비어 있으면 True
df.notnull() # 비어 있지 않으면 True
df.dropna()
df['전화번호'] = df['전화번호'].fillna('없음')
A + B
A.add(B, fill_value=0)
# 만약 인덱스가 같지 않으면 계산될 수 없으므로 NaN이 된다.
# 이를 방지하기 위해 없는 index 값은 fill_value = 0으로 채운다.
df = pd.DataFrame(data) # data는 dict
df['A'].sum()
df.sum()
df.mean()
df.sort_values('col1') # col1의 값들 정렬(기본 오름차순)
df.sort_values('col1', ascending=False) # 내림차순 정렬
df.sort_values(['col2', 'col1']) # col2를 정렬한 다음 col1을 정렬함(즉, col2가 같은 경우 col1을 정렬하게 된다.)
⚡ 두 열의 정렬 기준이 다르다면 ascending의 인자를 리스트로 주면 된다.
# col2를 기준으로 오름차순으로, col1를 기준으로 내림차순으로 정렬하기
df.sort_values(['col2', 'col1'], ascending=[True, False])
1. 조건 검색
import numpy as np
import pandas as pd
df['A'] < 0.5
df[(df['A'] < 0.5) & (df['B'] > 0.3)]
df.query('A < 0.5 and B > 0.3') # query로 조건 검색
2. 문자열 검색
df['Animal'].str.contains('Cat') # Cat을 포함하는지 확인
df.Animal.str.match('Cat') # Cat인지 확인
df['Animal'] == 'Cat' # Cat인지 확인
def square(x):
return x**2
df['Square] = df["Num"].apply(square)
df['Square] = df["Num"].apply(lambda x : x**2)
def get_processed_phone(phone):
mapping_dict = {
"공": "0",
...
}
for key, value in mapping_dict.items():
phone = phone.replace(key, value)
return phone
df['preprocessed_phone'] = df['phone'].apply(get_processed_phone)
df['Sex'] = df.Sex.replace({"Male": 0, "Female": 1})
# inplace=True : 그대로 데이터 값을 바꾸고 싶을 때 사용
df.Sex.replace({"Male": 0, "Female": 1}, inplace=True)
1. groupby
df.groupby('key')
# 출력시 'groupby object'가 출력된다.
# <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x10e3588>
df.groupby('key').sum()
# key를 묶고, data1을 묶는다.
df.groupby(['key', 'data1']).sum()
2. aggregate
df.groupby('key').aggregate([min, np.median, max])
df.groupby('key').aggregate({'data1': 'min', 'data2': np.sum})
3. filter
def filter_by_mean(x):
return x['data2'].mean() > 3
df.groupby('key').mean()
df.groupby('key').filter(filter_by_mean)
⚡ groupby에도 apply 적용이 가능하다.
df.groupby('key').apply(lambda x: x.max() - x.min())
4. get_group
df.gruopby('시도').get_group('충남') # 시도별로 묶인 것 중 '충남'에 대한 데이터만 가져올 수 있다.
len(df.gruopby('시도').get_group('충남'))
# 인덱스를 2차원 리스트를 만든다.
df = pd.DataFrame(
np.random.randn(4, 2),
index = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]],
columns = ['data1', 'data2']
)
df = pd.DataFrame(
np.random.randn(4, 4),
columns = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
)
df['A']
df['A']['1'] # A 컬럼의 1번 컬럼
- 데이터에서 필요한 자료만 뽑아서 새롭게 요약, 분석할 때 사용한다.
- 엑셀의 피봇 테이블과 같다.
세 가지 값이 필요하다
👉 index는 행 인덱스로 들어갈 key
👉 column에 열 인덱스로 라벨링될 값
👉 value에 분석할 데이터
타이타닉 데이터에서 성별과 좌석별 생존률 구하기
df.pivot_table(
index='sex',
columns='class',
values='survived',
aggfunc=np.mean # 채울 값을 결정한다.(나온 데이터들을 평균내서 채운다.)
)
df.pivot_table(
index='월별',
columns='내역',
values=['수입', '지출']
)
🐧 이 글은 엘리스 AI 트랙 과정 중 '실전 데이터 분석' 강의 내용을 바탕으로 작성 되었습니다.