Pandas Example

문주은·2022년 3월 29일
0

1. dict type object가 string type일 때 dict type 으로 변경

"""
Description:
	'{'a','b','c'}' -> {'a','b','c'}
"""
from ast import literal_eval
series.map(lambda x: literal_eval(x))

2. 특정 문자열을 포함한 키 값을 찾고 싶을 때

"""
Description:
	{'aaa':1, 'bbb':2, 'ccc':3} 에서 key값에 aaa를 포함한 키 값
"""
[k for k in dict.keys() if '문자열' in k]

3. series to list

"""
Description
  (AS-IS)
  df = pd.DataFrame({
      'column1' : [1,2,3],
      'column2' : ['a','b','c']
  })

  (TO-BE)
  ['a','b','c']
"""

df['column2'].to_list()

4. DataFrame to json 형변환
1) 방법1
인덱스를 Key 값으로, series는 value로

"""
Description:
  (AS-IS)
  df = pd.DataFrame({
      'column1' : [1,2,3],
      'column2' : ['a','b','c']
  })

  (TO-BE)
  {0: 'a', 1: 'b', 2: 'c'}
"""
dict(zip(df.index, df['column2']))

2) 방법2
key 값을 인덱스로 설정 후 to_dict()[원하는 value 값]

df.set_index('column1').to_dict()['column2']

5) json 문자열로 변환

"""
Description:
	(AS-IS)
	{'id': 1, 'username': 'je', 'email': 'juliy9812@naver.com'}
    
    (TO-BE)
    '{"id": 1, "username": "je", "email": "juliy9812@naver.com"}'
"""

import json
json_objects = {
    'id': 1,
    'username': 'je',
    'email': 'juliy9812@naver.com'
}

json.dumps(json_objects)

6) DataFrame의 index를 column으로 가져오기

"""
Description:
	(AS-IS)
    | column1 | column2 |
    |    1    |   'a'   |
    |    2    |   'b'   |
    |    3    |   'c'   |
    
    (TO-BE)
    | new_col | column1 | column2 |
    |    0    |    1    |   'a'   |
    |    1    |    2    |   'b'   |
    |    2    |    3    |   'c'   |
"""

df.reset_index().rename(columns={'index':'new_col'})

7) 시각화 할 때 한글 설정

import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib import rc, font_manager

for i in font_manager.fontManager.ttflist:
    print(i.name, i.fname)
    
font_fname = i.fname # 경로/글씨체.ttf
prop = font_manager.FontProperties(fname=font_fname)
mpl.rcParams['font.family'] = 'NanumGothic'
mpl.rcParams['axes.unicode_minus'] = False

# 세션 초기화
font_maager._rebuild()

plt.title('한글 테스트')

8) 특정 열에 null 값이 있는 행 삭제

"""
Description:
	(AS-IS)
	| column1 | column2 |
    |    1    |         |
    |    2    |   'b'   |
    |    3    |   'c'   |
    
    (TO-BE)
    | column1 | column2 |
    |    2    |   'b'   |
    |    3    |   'c'   |
"""

df_null = pd.DataFrame({
    'column1' : [1,2,3],
    'column2' : ['','b','c']
})

# 1) null 값을 np.nan으로 변경
df_null['column2'].replace('', np.nan, inplace=True)

# 2) np.nan인 행 삭제
df_null.dropna(subset=['column2'])

# 2_) or null 값을 0으로 변경
df_null.fillna(0)

9) loc, iloc
loc : 인덱스 값 자체
iloc : 인덱스의 순서(0번째, 1번째, ...)

"""
Description:
	(AS-IS)
           | column1 | column2 |
      1    |    2    |   'b'   |
      2    |    3    |   'c'   |
  
  	(TO-BE)
    column1  2
    column2  b
    Name: 1, dtype: object
    -> series 형태로 반환
"""
# ㅣoc 사용
df.loc[1]

# iloc 사용
df.iloc[0]

10) set으로 묶기
두 개의 컬럼을 하나의 set 형태의 데이터로 묶기

"""
Description:
	(AS-IS)
    | column1 | column2 |
	|    2    |   'b'   |
	|    3    |   'c'   |
    
    (TO-BE)
    | column1 | column2 | set_col |
	|    2    |   'b'   |  {2,b}
	|    3    |   'c'   |  {3,c}
"""
df.loc[:, 'set_col'] = df[['column1','column2']].agg(set, axis=1)

11) json key에 해당하는 데이터 가져오기

mapper = {
    1: 'first',
    2: 'second',
    3: 'third',
    4: 'fourth',
    5: 'fifth'
}

# return : 'third'
mapper[3]

# return : 'third'
mapperget(3)

# ['first', 'second', 'third'] (리스트를 return)
lst = [1,2,3]
list(map(lambda x: json.get(x), lst))

12) 특정 컬럼에 해당하는 값 가져오기
방법1) mapper 만들고 기준 컬럼을 통한 병합

"""
Description:
	mapper = df.set_index('기준컬럼명')['나타낼 컬럼명'].to_dict()
	병합할df.loc[:, 'column'] = 병합할df.loc[:, '기준컬럼명'].map(mapper명)
"""

df = pd.DataFrame({
    'column1' : ['a','b','c'],
    'column2' : ['apple','bike','circle']
})

# mapper 생성
mapper = df.set_index('column1')['column2'].to_dict()

# 새로운 DataFrame에 병합
new_df = pd.DataFrame({
    'column1' : [1,2,3],
    'column2' : ['a','b','c']
})
new_df.loc[:, 'new_col'] = new_df.loc[:, 'column2'].map(mapper)

방법2) merge
on='기준컬럼명' -> 두 데이터프레임의 컬럼명이 같아야 함.


13) groupby

  • groupby 2번 -> Multi index 생성
    df.groupby('column1').apply(lambda x: x.groupby('column2').size())

  • 모든 행 나열(sort_values, value_counts)
    df.groupby('column1').apply(lambda x: x.sort_values(by='기준'))

  • apply VS transform
    def categorize_status(group):
      if '00' in group.values:
          return 'success'
      elif '10' in group.values:
          return 'dead'
      else:
          return 'none'
    
    ## apply
    df['column2'] = df.groupby('status').apply(categorize_status)
    
    ## transform
    groups = df.groupby('key')['status']
    df['column2'] = groups.transform(categorize_status)
    • apply : 그룹에 함수를 적용할 때 사용
    • transform : 각 그룹에 함수를 적용하여 각 행에 대한 변환을 수행하고, 결과를 원래 데이터프레임과 동일한 모양의 Series로 반환

14) 두 개의 열을 비교한 후 조건에 맞는 새로운 컬럼 생성

df.apply(lambda x: True if x['column1'] in x['column2'] 
						else False, axis=1)

15) 특정값을 포함한 행 삭제

"""
Description:
	(AS-IS)
    | column1 |  column2 |
	|    a    |  apple   |
	|    b    |  bike    |
    |    c    |  circle  |
    
    (TO-BE)
    'bike'라는 특정 문자열을 가진 행 제거
    | column1 |  column2 |
	|    a    |  apple   |
    |    c    |  circle  |
"""
rm_row = df['column2'].isin(['bike'])
df[~rm_row]

16) 두개의 컬럼을 합쳐서 연산

"""
Description: 
	(AS-IS)
	| column1 |  column2 |
	|    a    |  apple   |
	|    b    |  bike    |
    |    c    |  circle  |
    
    (TO-BE)
    [('a', 'apple'), ('b', 'bike'), ('c', 'circle')]
"""

list(zip(df['column1'], df['column2']))

17) append row in data file(csv, parquet)

  • csv
df.to_csv('./tmp.csv', mode='a', index=False, header=False)
  • parquet
df.to_parquet('./tmp.parquet', engine='fastparquet', append=True)
profile
Data Engineer

0개의 댓글