본문 바로가기
데이터분석/Python

[Pandas] Basic

by Bookohol 2020. 7. 12.

 

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. 데이터 프레임 생성

  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

댓글