Pandas 101

Pandas 101

astype(type)

loc[[행], [열]] - 라벨 값을 기반으로 행 데이터 읽기 e.g. ) data_frame.loc[data_frame[‘Invoice Number’].str.startswith(‘920-‘), :]

iloc[[행], [열]] - 인덱스 값을 기반으로 단일 행을 선택해 열 헤더 행으로 사용할 수 있게 함

.ix[] > loc 과 같으나 경고 메세지 반환

’:’ > 모든 행


.columns - 열 출력 e.g.) data_frame.columns = data_frame.iloc[0]

.index - 행 출력


.contains() - 특정 문자열 포함 요소 탐색 e.g.) data_frame[‘Supplier Name’].str.contains(‘Z’))

.isin() - 특정 값의 포함 여부를 확인 후 boolean 타입으로 반환

.startswith('') - 특정 문자열로 시작되는 요소 탐색

.endswith('') - 특정 문자열로 끝나는 요소 탐색


.reindex()

drop() - 제거

read_csv(header = None, names = list_V)

concat(axis=0)- 0 = 수평 / 1 = 수직으로 합침

merge() > pandas.merge(DataFrame1, DataFrame2, on='key', how='inner')

Numpy > numpy.concatenate([array1, array2], axis=1)

numpy.hstack((array1, array2))

numpy.c[array1, array2]

Data Frame

Series를 모아 만든 Data Table == 기본 2차원 각 열마다 고유의 데이터 타입을 가질 수 있음
구조적 데이터 구조에 대한 분석 > 가장 적합한 data object
각 row instance, tuple 마다 인덱스가 있고, 각 컬럼별로도 인덱스값이 있음

Nested Dict

1
2
pop = {'Nevada' : {2001:2.4, 2002:2.9}, 'Ohio' : {2000 : 1.5, 2001 : 1.7, 2002 : 3.6}}
pd.DataFrame(pop)

Selection

  1. df.name - Series
  2. df['name'][:3] - column name with index num
  3. df['name'][[0, 5, 10]] - return values more than 1 index
  4. df[df['name' > 25]] - return values more than 25 in dataframe
  5. df[:3] - return 0, 1, 2 rows by row
  6. df[['col1', 'col2']][:2] - return 2 rows only in col1, col2
  7. df[['col1', 'col2']].iloc[:10] - return 0 to 10 rows only in col1, col2
  8. df.index = list(range(0, df.shape[0])) - re indexing

Drop

  1. df.drop(1) - drop row that index num 1
  2. df.drop([0,1,3,6]) - drop rows after multiple index
  3. df.drop('col_name', axis=1) # same as del df['col_name']


Basic Operation in DataFrame

Series operation

numpy랑 비슷
index 기준으로 연산을 수행 > 겹치는 index 가 없는 경우 NaN 반환
넘파이는 사이즈가 같지 않으면 error / 시리즈는 에러는 없지만 리스트 인덱스를 기준으로 더해주면서 없을 경우 nan

  1. df1.add(df2, fill_value=0) - add df2 to df1

Series + DataFrame

data는 column 이름을 기준으로 broadcasting이 일어남
축을 변경해서 ( 세로 > 가로 ) 더해주면, s2의 index (원래 column) 값과 df의 index 값을 기준으로 broadcasting이 일어남

Lambda, Map, Apply

lambda 함수

한 줄로 함수를 표현하는 익명함수
lambda argument : expression

map 함수

함수와 sequence형 데이터를 인자로 받아 각 lmn 마다 입력받은 함수를 적용해 list 반환
일반적으로 함수를 lambda 형태로 표현

1
2
3
4
5
ex = [1,2,3,4,5]
f = lambda x, y: x + y
list(map(f, ex, ex))
#
list(map(lambda x: x+x, ex))
Map for Series

Pandas의 Series type 데이터에도 map 함수 사용 가능
function 대신 dict, sequence형 자료 등으로 대체 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
s1 = Series(np.arange(10))
s1.map(lambda x: x**2)
# output
0     0
1     1
2     4
3     9
4    16
5    25
6    36
7    49
8    64
9    81
dtype: int64
  
z = {1 : 'a', 2 : 'b', 3 : 'c'}
s1.map(z)
# output
0    NaN
1      a
2      b
3      c
4    NaN
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN
dtype: object
  
# e.g. 1
df['sex_code'] = df.sex.map({'male' : 0, 'female' : 1}) 
# e.g. 2
df['height_categories'] = df.height.map(lambda x : '대' if x > 70 else '소')

Apply for dataframe

map과 달리 series 전체 - column 전체에 해당 함수 적용 - map 은 각 lmn마다 lambda를 적용시키는 경우라면
입력값이 series 데이터로 입력받아 handling 가능
각 컬럼별로 반환 - 통계 자료 뽑을 때 유용함
요약 정보를 보기 위한 data frame 형태로도 사용이 가능

1
2
3
4
5
6
7
8
f = lambda x : x.max() - x.min()
df_info.apply(f) 
# f == 시리즈 데이터 전체가 들어감. 데이터 전체의 최대 최소를 구해진 후 반환이 됨

def f(x):
    return Series([x.min(), x.max(), x.mean()], index=['min', 'max', 'mean']) 
# 두 행을 새로 생성해서 전체 데이터를 집어 넣어 min, max 찾기
df_info.apply(f)


Applymap for dataFrame

  • Series 단위가 아닌 lmn 단위 전체에 함수를 적용
  • Series 단위에 apply를 적용시킬 때와 같은 효과
    1. applymap, apply : DF 단위 내에서
    2. map : Series 단위 내에서
1
2
f = lambda x : -x
df_info.applymap(f).head(5)

Built-in Functions

describe

Numeric type 데이터 요약 정보

pandas_describe

Unique

Series data의 유일한 값을 list로 반환
데이터 라벨링-라벨인코더가 가능해짐 dict(enumerate(df['column_name'].unique()))

pandas_dict_enumerate

1
2
3
4
5
6
7
8
value = list(map(int, np.array(list(enumerate(df['race'].unique())))[:, 0].tolist()))
key = np.array(list(enumerate(df['race'].unique())), dtype=str)[:, 1].tolist()
value, key

#output
([0, 1, 2, 3], ['white', 'other', 'hispanic', 'black'])

df.race.replace(to_replace=key, value=value, inplace=True)

Sum

기본적인 column 또는 row 값 연산 지원 sub, mean, min, max, count, median, mad, var 등등

  1. df.sum(axis=0) # column sum

    sum by column name

  2. df.sum(axis=1) # row sum

isnull

값이 존재하지 않으면 null인 값의 합 ( 결측치 ) - 개수 등
column 또는 row 값의 NaN(null) 값의 index 반환

df.isnull().sum(0) # sum의 파라미터 : 1 - 행 별로 0 - 열 별로

sort value

column 값을 기준으로 데이터 sorting

  1. df.sort_values(['age', 'earn'],ascending=False) # sort by age > earn
  2. df.sort_values(by='age', ascending = False)

cumsth

  1. cumsum
    점점 증가함 : 1번째 줄 + 2번째 줄.. 2+3… 3+4… 증가해서 표현
    주식이나 시간에 순서에 따른 거래량 표현 등을 할 때 유용히 사용
  2. cummax

Correlation & Covariance

상관계수와 공분산을 구하는 함수
corr, cov, corrwith

  1. df.age.corr(df.earn) 나이와 소득간의 상관관계
  2. df.corrwith(df.earn) 소득과 연관관계가 많은 것
  3. df.corr() 전체 간의 상관관계
  4. df.age[df.age < 50].corr(df.earn)
    55세 이하일 때 소득과 나이의 상관관계
  5. df.age[(df.age < 45) & (df.age > 25)].corr(df.earn) 나이 대가 증가함에 따라 소득도 증가함을 알 수 있음
  6. df.corrwith(df.earn) 특정 데이터만 볼 수 있음
  7. df.sex.value_counts(sort=False) 성별 별 데이터


Errors

  1. modulenotfounderror no module named 'pandas'

    가상환경을 열어서 pandas 설치하고 지웠다가 다시 설치하고 컴퓨터 재부팅하고 막… 오만가지 난리를 펼치다가… 터미널 창에서 which python3 입력해서 나오는 주소를 py 파일 라인 1에 붙여넣고 실행하니 오류 해결!

    #! /Users/park-eunbin/miniconda3/envs/IP/bin/python3


  2. b’Skipping line 13: expected 5 fields, saw 7\n’ -> data_frame = pd.read_csv(input_file, error_bad_lines=False, warn_bad_lines=False) 로 해결
  3. pandas .ix[] Message
1
2
3
4
5
.ix is deprecated. Please use

.loc for label based indexing or

.iloc for positional indexing
  1. delimiter =',' 오류 > 해결 못함… 왜? 왜 $1,600.60을 제대로 못걸러내냐