Series ?
- Series는 numpy의 1차원 배열과 구조가 동일하다.
- 인덱스와 칼럼명을 가지고 있어서 numpy보다 사용이 편리
- index를 지정해서 key값으로 사용할 수 있음
- Series를 여러 개 붙이면 Dataframe이 됨
import pandas as pd
data = pd.Series(['one','two','three'])
data.values
>>> array(['one','two','three'])
data.index
>>> RangeIndex(start=0, stop=3, step=1)
data = pd.Series(data.values, index=[2,3,4])
>>>
2 one
3 two
4 three
data[2] # list와 같이 순서대로
>>> 'three'
data['2'] # index 지정 시 str로 인식
>>> 'one'
Dataframe ?
- dataframe는 numpy의 ndArray를 기반으로 한 행과 열로 이루어진 데이터 구조이다.
- Series가 1차원 자료구조라면, 이 1차원의 자료구조가 여러 개 모인 2차원 데이터 구조이다. 우리가 흔히 아는 엑셀과 동일한 형태의 자료이다.
1. 데이터 프레임 생성
- dictionary로 dataframe 생성 기본 자료 구조이므로 데이터프레임 생성이 가능
## row oriented
friend_dict_list = [{'name': 'Jone', 'age': 20, 'job': 'student'},
{'name': 'Jenny', 'age': 30, 'job': 'developer'},
{'name': 'Nate', 'age': 30, 'job': 'teacher'}]
df = pd.DataFrame(friend_dict_list)
>>>
age job name
0 20 student Jone
1 30 developer Jenny
2 30 teacher Nate
## column oriented
sales = {'account': ['Jones LLC', 'Alpha Co', 'Blue Inc'],
'Jan': [150, 200, 50],
'Feb': [200, 210, 90],
'Mar': [140, 215, 95]}
df = pd.DataFrame.from_dict(sales)
# column 순서 바꾸고자 할 때
df = df[['name', 'age', 'job']]
df
>>>
name age job
0 Jone 20 student
1 Jenny 30 developer
2 Nate 30 teacher
2. OrderedDict로 데이터프레임 생성하기
: OrderedDict 자료구조로 데이터프레임을 생성하면, 컬럼의 순서가 뒤바뀌지 않습니다
from collections import OrderedDict
friend_ordered_dict = OrderedDict([ ('name', ['John', 'Jenny', 'Nate']),
('age', [20, 30, 30]),
('job', ['student', 'developer', 'teacher']) ] )
df = pd.DataFrame.from_dict(friend_ordered_dict)
df
>>>
name age job
0 John 20 student
1 Jenny 30 developer
2 Nate 30 teacher
3. list로 데이터프레임 생성하기
## row oriented
friend_list = [ ['John', 20, 'student'],['Jenny', 30, 'developer'],['Nate', 30, 'teacher'] ]
column_name = ['name', 'age', 'job']
df = pd.DataFrame.from_records(friend_list, columns=column_name)
df
>>>
name age job
0 John 20 student
1 Jenny 30 developer
2 Nate 30 teacher
## column oriented
friend_list = [
['name',['John', 'Jenny', 'Nate']],
['age',[20,30,30]],
['job',['student', 'developer', 'teacher']]
]
df = pd.DataFrame.from_dict(OrderedDict(friend_list))
#pandas 내장 함수
df.head(5) #앞에 5개
df.tail(2) #뒤에서 2개
df.shape
df.index
df.columns
df.reset_index
df.drop('column 이름', axis=1)
# axis=1은 컬럼을 뜻한다. axis=0인 경우, 로우를 삭제하며 이것이 디폴트이다.
df.drop('column 이름', axis=1, inplace=True)
# inplace = True 는 df=df.drop('column 이름', axis=1) 의미임
#pandas library 호출 및 csv 파일 읽기
import pandas as pd
df = pd.read_csv('data/test.csv')
2. 데이터 프레임 특징 파악
df.head() # 처음 5행 표시
df.tail() # 마지막 5행 표시
df.shape # 데이터프레임 차원 파악
df.describe() # 숫자로 된 열의 통곗값 파악
df.age.mean() # 각 열별로 통곗값 파악
df.age.max()
df.age.min()
df.age.sum()
df.age.var()
df.age.std()
df.age.median()
df.corr() # 수치형 열 간의 상관계수
df.cov() # 공분산
df.count() # 각 열의 데이터 갯수
df.Pclass.unique() # 해당 열의 고윳값
df.Pclass.value_counts() # 해당 열의 고윳값과 데이터 수
df.nuique() # 고유한 값의 개수를 알고싶을 때
df.duplicated() # 중복된 값 여부 boolean으로 return
df.duplicated(['Age']) # 특정 열에서 중복된 값 여부 boolean으로 return
3. 데이터 프레임 선택
# 데이터 프레임의 위치 참조 (정수 index)
df.iloc[0] # 첫 번째 행 선택
df.iloc[:,0] # 모든 행, 첫 번째 열 선택
df.iloc[:4] # 4개 행 선택
# 데이터 프레임의 index가 lable(문자열), 조건 일 때 사용
df.loc['color']
df.loc[df.price>10]
# 둘다 마지막 인덱스를 포함함
# 조건에 따라 데이터 프레힘 행을 선택 할 때
df[(df.sex=='female')&(df.age>65)]
4. 데이터 프레임 값 치환
df.sex.replace('female','woman')
# sex 열에 female을 woman으로 바꿈
df.sex.replace(['female','male'],['woman','man'])
# 두 개 이상의 값을 바꿀 경우
df.replace(['female','male'],'person')
# 여러 개의 값을 한 개의 값으로 변경할 경우
df.replace(1, 'one')
# 전체 데이터 프레임에서 1을 one으로 변경
df.replace(r'1st', 'First', regex=True)
# 정규 표현식 지원
df.replace({'female' :1, 'male' :0})
# dictionary 형태로 매핑값 지정
5. 데이터 프레임 column, index 이름 변경
df.rename(columns={'Pclass':'Passenger Class'})
# dictionary 형태로 전달
df.rename(columns={'Pclass':'Passenger Class'}, {'Sex':'Gender'})
# 여러개의 값을 변환
# 전체 열의 이름을 동시 변경 시 열 이름 dictinary 생성 후 rename 함수로 전달
import collections
column_names=collections.defaultdict(str)
for name in df.columns:
column_names[name]
column_names
>>>
defaultdict(str, {'Name' : '', 'Pclass' :'', 'Gender' : ''}
# index 명 변경 시
df.replace(index={'first':1})
6. 결측치 값 검사 및 제거, 치환
# NaN 검사 (boolean 값으로 치환됨)
df.isnull()
df[df.isnull()] = value # null 이 있는 부분을 특정 value로 치환
df.notnull()
# 결측치 제거
df.dropna() #결측치 포함 행 삭제
# 결측치 치환
df.fillna(value) # 모든 NA 값을 특정 value로 치환
7. 열 삭제
df.drop('Age', axis=1) #axis=1 열을 삭제
df.drop(['Age','Pclass'], axis=1) #여러 행을 삭제할 경우 list로 전달
df.drop(df.columns[1], axis=1) #column 이름이 없을 경우
# inplace=True 매개변수를 사용하는 걸 권장하지 않음
df_drop=df.drop('Age', axis=1)
8. 행 삭제
# boolean 조건을 통해 삭제하고 싶은 행을 제거
df = df[df.Age > 60]]
# drop 보다 boolean 조건을 활용하는 것이 여러 행을 동시에 삭제가능
df[df.index !=0]
# index 명으로 행 삭제
df.drop_duplicates() # 모든 열이 완벽하게 동일한 행을 삭제함
df.drop_duplicates(subset=['Age'])
# 특정열에서의 값이 중복될 경우 첫 번째 값이 등장한 행만 남기고 삭제
df.drop_duplicates(subset=['Age'], keep='last')
# 마지막 값만 남기고 삭제
9. 그룹 연산
# groupby는 각 그룹에 적용할 연산을 필요로 함
df.groupby('Sex').mean() #성별끼리 나눠 평균
df.groupby('Survived')['Name'].count()
# 생사 여부로 나눈 뒤 각 이름별로 승객 수를 셈
df.groupby(['Survived','Sex'])['Age'].mean()
# 여러 계층으로 그룹화 가능
df.groupby('Sex').apply(lambda x: x.count())
# 성별로 그룹화 한 뒤 각각 열에 대해 데이터 수 파악
df.groupby('Sex').agg(['sum','mean'])
# 성별로 그룹화 한 뒤 여러 함수를 적용
10. 함수 적용
# 열에 있는 모든 원소에 함수를 적용하고 싶을 경우
def uppercase(x):
return x.upper()
df['Name'].apply(uppercase)
# apply 함수 (그룹별 적용, dataframe 행/열)
df['Age'].apply(lambda x, age : x < age, age=30)
df.apply(lambda x:max(x)) # 각 열에서 가장 큰 값을 뽑아냄
# map 함수 (원소별 적용, 1차원 list, Series)
df.['Survived'].map({1: 'live', 0:'Dead'})
# applymap 함수 (2차원 dataframe)
df.applymap(uppercase)
11. 데이터 프레임 연결
pd.concat([df1, df2] axis=0)
# 행 방향으로 데이터프레임 연결
pd.concat([df1, df2], axis=1)
# 열 방향으로 데이터프레임 연결
pd.concat([df1, df2], axis=1, join='inner', ignore_index=True)
# 동일하게 있는 부분만 병합
pd.merge(df1, df2, on='column 명')
# 두 데이터 프레임의 column을 기준으로 동일한 데이터가 있는 행만 병합 inner join
pd.merge(df1, df2, on='column 명', how='outer')
# colum 내 동일한 데이터가 없는 부분도 모두 병합, 없는 데이터는 NaN으로 채워짐
pd.merge(df1, df2, on='column 명', how='left')
# 왼쪽을 기준으로 오른쪽 데이터 프레임의 경우
# 왼쪽 데이터 프레임에 있는 데이터와 매칭되는 행만 반환
'데이터분석 > Python' 카테고리의 다른 글
[Numpy] ndarray의 인덱싱과 정렬 (0) | 2020.07.12 |
---|---|
[Pandas] 데이터 프레임의 이해와 생성 (0) | 2020.03.23 |
댓글