실습 환경 - Google Colab
문자열¶
In [1]:
import pandas as pd
df = pd.DataFrame({'A': ['블루베리 스무디', '딸기 스무디', '딸기 바나나 스무디'],
'B': [10, 20, 30],
'C': ['추천/신메뉴', '신메뉴/할인', '사이즈업/추천'],
'D': ['ab cd', 'AB CD', 'ab cd']
})
df
Out[1]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 스무디 | 10 | 추천/신메뉴 | ab cd |
1 | 딸기 스무디 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 스무디 | 30 | 사이즈업/추천 | ab cd |
In [4]:
# replace : 전체 문자가 일치해야 변경 가능
df['A'] = df['A'].replace('스무디', '에이드')
df
# -> 일부만 변경하려고 하니 변경 x
Out[4]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 스무디 | 10 | 추천/신메뉴 | ab cd |
1 | 딸기 스무디 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 스무디 | 30 | 사이즈업/추천 | ab cd |
In [7]:
# str.replace, 일부 일치하는 문자 변경
# str 접근자를 활용해 python 문자열처럼 다루기
df['A'] = df['A'].str.replace('스무디', '에이드')
df
Out[7]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 에이드 | 10 | 추천/신메뉴 | ab cd |
1 | 딸기 에이드 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 에이드 | 30 | 사이즈업/추천 | ab cd |
In [8]:
# replace 데이터프레임
# -> str접근자는 시리즈에서만 사용 가능, 데이터프레임에서 사용 불가능
df.str.replace('블루베리 에이드', '청포도 에이드')
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-8-9314056515f5> in <cell line: 2>() 1 # replace 데이터프레임 ----> 2 df.str.replace('블루베리 에이드', '청포도 에이드') /usr/local/lib/python3.10/dist-packages/pandas/core/generic.py in __getattr__(self, name) 5987 ): 5988 return self[name] -> 5989 return object.__getattribute__(self, name) 5990 5991 def __setattr__(self, name: str, value) -> None: AttributeError: 'DataFrame' object has no attribute 'str'
In [9]:
# replace 데이터프레임
# -> str접근자는 시리즈에서만 사용 가능, 데이터프레임에서 사용 불가능
df.replace('블루베리 에이드', '청포도 에이드')
Out[9]:
A | B | C | D | |
---|---|---|---|---|
0 | 청포도 에이드 | 10 | 추천/신메뉴 | ab cd |
1 | 딸기 에이드 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 에이드 | 30 | 사이즈업/추천 | ab cd |
In [10]:
# 숫자 변경
df['B'] = df['B'].replace(10, 100)
df
Out[10]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 에이드 | 100 | 추천/신메뉴 | ab cd |
1 | 딸기 에이드 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 에이드 | 30 | 사이즈업/추천 | ab cd |
In [11]:
# 숫자 변경(str.replace)
# str 접근자는 문자에만 사용 가능
df['B'] = df['B'].str.replace(10, 100)
df
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-11-24e804e40d32> in <cell line: 2>() 1 # 숫자 변경(str.replace) ----> 2 df['B'] = df['B'].str.replace(10, 100) 3 df /usr/local/lib/python3.10/dist-packages/pandas/core/generic.py in __getattr__(self, name) 5987 ): 5988 return self[name] -> 5989 return object.__getattribute__(self, name) 5990 5991 def __setattr__(self, name: str, value) -> None: /usr/local/lib/python3.10/dist-packages/pandas/core/accessor.py in __get__(self, obj, cls) 222 # we're accessing the attribute of the class, i.e., Dataset.geo 223 return self._accessor --> 224 accessor_obj = self._accessor(obj) 225 # Replace the property with the accessor object. Inspired by: 226 # https://www.pydanny.com/cached-property.html /usr/local/lib/python3.10/dist-packages/pandas/core/strings/accessor.py in __init__(self, data) 179 from pandas.core.arrays.string_ import StringDtype 180 --> 181 self._inferred_dtype = self._validate(data) 182 self._is_categorical = is_categorical_dtype(data.dtype) 183 self._is_string = isinstance(data.dtype, StringDtype) /usr/local/lib/python3.10/dist-packages/pandas/core/strings/accessor.py in _validate(data) 233 234 if inferred_dtype not in allowed_types: --> 235 raise AttributeError("Can only use .str accessor with string values!") 236 return inferred_dtype 237 AttributeError: Can only use .str accessor with string values!
In [12]:
# 어절 나누기 : split()
df['A'].str.split()
Out[12]:
0 [블루베리, 에이드] 1 [딸기, 에이드] 2 [딸기, 바나나, 에이드] Name: A, dtype: object
In [14]:
# 어절 나눈 후 첫 번째 값 : .str[0]
df['A'].str.split().str[0]
Out[14]:
0 블루베리 1 딸기 2 딸기 Name: A, dtype: object
In [16]:
# 어절 나눈 후 첫 번째 값을 새로운 컬럼으로 대입
df['E'] = df['A'].str.split().str[0]
df
Out[16]:
A | B | C | D | E | |
---|---|---|---|---|---|
0 | 블루베리 에이드 | 100 | 추천/신메뉴 | ab cd | 블루베리 |
1 | 딸기 에이드 | 20 | 신메뉴/할인 | AB CD | 딸기 |
2 | 딸기 바나나 에이드 | 30 | 사이즈업/추천 | ab cd | 딸기 |
In [17]:
# 특수문자 기준으로 어절 나누기(/) : split('/')
df['C'].str.split('/')
Out[17]:
0 [추천, 신메뉴] 1 [신메뉴, 할인] 2 [사이즈업, 추천] Name: C, dtype: object
In [18]:
# 특정 문자 찾기 : str.contains()
df['A'].str.contains('딸기')
Out[18]:
0 False 1 True 2 True Name: A, dtype: bool
In [19]:
# 특정 문자 찾은 후 새컬럼에 대입 (contains)
df['is딸기'] = df['A'].str.contains('딸기')
df
Out[19]:
A | B | C | D | E | is딸기 | |
---|---|---|---|---|---|---|
0 | 블루베리 에이드 | 100 | 추천/신메뉴 | ab cd | 블루베리 | False |
1 | 딸기 에이드 | 20 | 신메뉴/할인 | AB CD | 딸기 | True |
2 | 딸기 바나나 에이드 | 30 | 사이즈업/추천 | ab cd | 딸기 | True |
In [20]:
# 데이터
menu = pd.Series(['맛난버거 세트', '맥운 치킨버거', '더블 치즈버거'])
In [21]:
# 특정 값이 있는지 확인하기 : isin()
menu.isin(['맛난버거 세트', '더블 치즈버거'])
Out[21]:
0 True 1 False 2 True dtype: bool
In [22]:
# # 특정 단어가 있는지 확인하기
# isin() -> 특정 단어가 있는지 확인 불가능
menu.isin(['세트'])
Out[22]:
0 False 1 False 2 False dtype: bool
In [23]:
# 특정 단어가 있는지 확인하기 : contains()
# -> 여러 단어를 찾을 수 없음, 한 개 단어만 찾기 가능
menu.str.contains('세트')
Out[23]:
0 True 1 False 2 False dtype: bool
In [24]:
# 문자 길이 : len()
df['A'].str.len()
Out[24]:
0 8 1 6 2 10 Name: A, dtype: int64
In [25]:
# 대소문자 구분
'AB cd' == 'ab CD'
Out[25]:
False
In [26]:
# 소문자로 변경 : lower()
df['D'].str.lower()
Out[26]:
0 ab cd 1 ab cd 2 ab cd Name: D, dtype: object
In [27]:
# 대문자로 변경 : upper()
df['D'].str.upper()
Out[27]:
0 AB CD 1 AB CD 2 AB CD Name: D, dtype: object
In [30]:
df2 = pd.DataFrame({'A': ['블루베리 스무디', '딸기 스무디', '딸기 바나나 스무디'],
'B': [10, 20, 30],
'C': ['추천/신메뉴', '신메뉴/할인', '사이즈업/추천'],
'D': ['ab cd', 'AB CD', 'ab cd ']
})
df2
Out[30]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 스무디 | 10 | 추천/신메뉴 | ab cd |
1 | 딸기 스무디 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 스무디 | 30 | 사이즈업/추천 | ab cd |
In [37]:
# AB CD와 같은가?
df2['D'] = df2['D'].str.upper()
df2
Out[37]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 스무디 | 10 | 추천/신메뉴 | AB CD |
1 | 딸기 스무디 | 20 | 신메뉴/할인 | AB CD |
2 | 딸기 바나나 스무디 | 30 | 사이즈업/추천 | AB CD |
In [38]:
# 2번째는 마지막에 공백이 추가되어 False가 나옴
df2['D'] == 'AB CD'
Out[38]:
0 True 1 True 2 False Name: D, dtype: bool
In [40]:
# 공백 제거
df2['D'] = df2['D'].str.replace(' ', '')
df2
Out[40]:
A | B | C | D | |
---|---|---|---|---|
0 | 블루베리 스무디 | 10 | 추천/신메뉴 | ABCD |
1 | 딸기 스무디 | 20 | 신메뉴/할인 | ABCD |
2 | 딸기 바나나 스무디 | 30 | 사이즈업/추천 | ABCD |
In [42]:
df2['D'] == 'ABCD'
Out[42]:
0 True 1 True 2 True Name: D, dtype: bool
In [44]:
# 문자열 슬라이싱 : df[].str[]
df2['D'].str[:2]
Out[44]:
0 AB 1 AB 2 AB Name: D, dtype: object
In [45]:
# 데이터프레임 슬라이싱 : df[][] -> 행이 슬라이싱
df2['D'][:2]
Out[45]:
0 ABCD 1 ABCD Name: D, dtype: object
In [47]:
# 데이터
df = pd.DataFrame({'date':['2024년 3월', '2024년 4월', '2025년 5월']})
df
Out[47]:
date | |
---|---|
0 | 2024년 3월 |
1 | 2024년 4월 |
2 | 2025년 5월 |
In [51]:
# 연도
df['date'].str[:4]
Out[51]:
0 2024 1 2024 2 2025 Name: date, dtype: object
In [52]:
# 월
df['date'].str[6:7]
Out[52]:
0 3월 1 4월 2 5월 Name: date, dtype: object
참고
[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3) | 퇴근후딴짓 - 인프런
퇴근후딴짓 | 비전공자, 입문자가 빅데이터 분석기사 실기를 빠르게 취득할 수 있도록 안내해드려요! 꼭 필요한 파이썬, 판다스, 머신러닝을 다루고 있어요!, ❤️공지❤️ 7회 기출 유형 업데이
www.inflearn.com
'자격증 > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사] 8회 실기 합격 후기 (feat. 공부 방법) (0) | 2024.07.16 |
---|---|
[빅데이터분석기사] 6회 필기 합격 후기 (0) | 2024.07.15 |
[빅데이터분석기사] 작업형1 - 시계열 데이터 2 (0) | 2024.06.10 |
[빅데이터분석기사] 작업형1 - 시계열 데이터 1 (0) | 2024.06.10 |
[빅데이터분석기사] 작업형1 - 판다스 기초 3 (0) | 2024.06.10 |