import pandas as pd
DriveUrl = 'https://drive.google.com/'
df = pd.read_csv(DriveUrl)
type(df)
df.head()
# head(): DataFrame에서 처음 5개의 행 가져오기
df[df['quantity']==3].head()
DataFrame(df)에서 특정 값이 df['column_이름']==3
을 만족하는 행들을 선택하여 처음 5개의 행을 가져오겠다는 의미이다.
Python에서는
같다
는=
가 아닌 같다 기호 (==
)를 쓴다.
df.loc[df['quantity']==3].head().reset_index(drop=True)
# reset_index(): 기존의 인덱스가 새로운 column으로 선언
# reset_index(drop=True): 선택한 행들의 인덱스를 재설정하고, 기존의 인덱스 삭제
reset_index()
함수를 사용하지 않았을 때:
reset_index()
함수를 사용했을 때:
drop=True
옵션은 reset_index()
함수를 사용할 때, 기존의 인덱스를 새로운 열로 추가하지 않고 제거하도록 지시하는 것이다. 따라서 이 옵션을 사용하면 기존의 인덱스가 새로운 열로 추가되지 않고 제거된다. 이렇게 하면 불필요한 인덱스 열을 유지하지 않아도 되므로 데이터프레임이 깔끔해지게 된다.
df[['quantity','item_price']]
2개의 컬럼을 불러올때는 대괄호 [ ]
로 안쪽에 묶어서 컬럼을 정리하고 대괄호 [ ]
를 한번 더 묶으면 해당 컬럼만 출력하라는 의미이다.
새로운 DataFrame으로 정의하기 위해서는 위에서 쓰던 df가 아닌 다른 DataFrame(e.g., df2)을 써야한다.
df2 = df[['quantity','item_price']]
df2.head()
여기서 d2는 quantity와 item_price라는 두개의 컬럼만 구성된 새로운 DataFrame이 만들어진다.
# 'item_price' 열의 각 값에서 달러 표시(첫 번째 문자)를 제거한 새로운 문자열 반환
df['item_price'].str[1:]
예를 들어, 'item_price' 열의 값이 "$10.99"라면, 위 코드를 적용하면 "10.99"가 반환된다.
# 'item_price' 열의 각 값에서 0번째 인덱스부터 시작하여 모든 문자 반환
df['item_price'].str[0:]
예를 들어, 'item_price' 열의 값이 "$10.99"라면, 위 코드를 적용하더라도 "$10.99"가 그대로 반환된다.
# 'item_price' 열의 각 값에서 0번째 인덱스부터 1번째 인덱스 전까지(즉, 첫 번째 문자) 반환
df['item_price'].str[0:1]
# 'item_price' 열의 각 값에서 0번째 인덱스부터 2번째 인덱스 전까지(즉, 첫 번째 문자부터 두 번째 문자까지) 반환
df['item_price'].str[0:2]
# 'item_price' 열에서 달러 표시를 제거한 후에 남은 문자열을 실수형(float)으로 변환하여 'new_price'라는 새로운 컬럼에 할당, 'new_price' 컬럼의 처음 5개의 값을 'Ans' 변수에 할당
df['new_price'] = df['item_price'].str[1:].astype('float')
Ans = df['new_price'].head()
Ans
# astype('float'): 실수형(float)으로 변환
# 'new_price' 열에서 값이 5 이하인 행들의 개수를 세어서 결과값 반환
len(df[df['new_price'] <=5])
# len(): 생성된 새로운 DataFrame의 길이(행의 개수) 계산
# 결과값:
# 1652
# 'item_name' 열 값이 'Chicken Salad Bowl'인 행들을 추출한 후에, 인덱스 값을 초기화
df.loc[df.item_name =='Chicken Salad Bowl'].reset_index(drop=True)
조건을 만족하는 데이터를 가져올 때 df[df['new_price']] 또는 df.loc[df.item_name]라고 사용해도 된다.
iloc
는 순서 또는 위치 기반의 인덱싱(indexing) 하는 기법이다. (예시: `df.iloc[0]는 첫 번째 행 선택)loc
는 값 기준으로 인덱싱(indexing) 하는 기법이다. (예시: df.loc[0]
은 인덱스가 0인 행 선택)여기서 잠깐 타임!
아래 두 코드 다 동일한 방법이다.
df['new_price'] # `대괄호 [ ]`로 묶어서 '따옴표' 안에 값을 넣어주는 방법 df.item_name # `점(.)`을 기준으로 컬럼 값을 바로 적는 방법
한가지 주의사항으로 컬럼 값이 공백이 있을 경우 (예: new price), 위의 기능으로 불러올 수 없다.
- 공백이 있을 경우,
df['new price']
를 사용 해야한다.- 공백이 없는 경우,
df['new_price']
,df.item_name
처럼 둘 다 사용 가능하다.
Ans = df.loc[(df.item_name =='Chicken Salad Bowl') & (df.new_price <= 9)]
Ans.head()
두 가지 이상의 조건을 만족하려고 하면 각 조건을 괄호 ( )
로 묶어줘야한다. 두 조건을 동시에 만족해야하면 조건 연산자 &(and)
를 사용해야한다.
Python에서는 논리 연산자 'and'를
&
로 표시한다
Ans = df.sort_values('new_price').reset_index(drop=True)
Ans.head()
sort_values()
메서드를 사용하여 데이터프레임을 정렬할 수 있다. 이 메서드는 정렬 기준이 되는 열의 값을 인자로 받는다.
기본적으로 sort_values()
메서드를 사용할 때는 오름차순으로 정렬이 이루어진다. 따라서 추가적인 옵션을 지정하지 않으면 오름차순으로 정렬된다.
예를 들어, 'col_name' 열을 기준으로 데이터프레임을 오름차순으로 정렬하는 경우:
df.sort_values(by='col_name')
내림차순으로 정렬하려면 ascending=False
옵션을 추가한다.
df.sort_values(by='col_name', ascending=False)
하지만 기본적으로 오름차순으로 정렬되므로, 옵션을 할당할 필요가 없다.
# 'item_name' 열의 값 중에서 특정 문자열('Chips')을 포함하는 행들을 추출
Ans = df.loc[df.item_name.str.contains('Chips')]
Ans.head()
위 26번과 27번 문제들은 item_name 중 chicken salad bowl의 full name을 추출하였지만 해당 문제는 'item_name' 열의 값 중에서 'Chips'라는 문자열을 포함하는 행들을 추출하기 때문에 str.cotntains()
명령어를 사용해야 한다.
Ans = df.iloc[:,::2]
Ans.head(5)
# [:, ::2]: 모든 행(`:`)을 선택하고, 짝수 번째 열(`::2`)을 선택
::2
옵션은 짝수 번째 열만 선택한다.
Ans = df.sort_values('new_price', ascending=False).reset_index(drop=True)
Ans.head()
reset_index(drop=True)
명령어 불포함:
Ans = df.sort_values('new_price', ascending=False)
Ans.head()
reset_index(drop=True)
명령어를 사용하지 않으면 위의 이미지와 같이 정렬된 데이터프레임의 인덱스가 이전의 순서를 유지하게 된다. 이로 인해 인덱스가 뒤죽박죽이 되어 데이터를 읽기가 불편해진다.
올바른 방법은 reset_index(drop=True)
명령어를 사용하여 인덱스를 재설정하여 데이터프레임의 인덱스가 0부터 시작하게 하는 것이다. 이렇게 하면 데이터를 더 쉽게 읽고 이해할 수 있다.
Ans = df.loc[(df.item_name =='Steak Salad') | (df.item_name =='Bowl')]
Ans.head()
아래와 같이 loc를 쓰지 않아도 모두 동일한 결과를 반환한다.
Ans = df[(df.item_name =='Steak Salad') | (df.item_name =='Bowl')]
Ans.head()
데이터 인덱싱하기 = 데이터 찾기
데이터프레임에서 특정 조건을 만족하는 행을 선택할 때,or 조건
을 나타내는|
를 사용한다.
문제에서 첫번째 케이스만 남기기
라는 의미는 테이블에서 'item_name' 열 중 첫번째 데이터와 세번째 데이터가 같을 시 첫번째 데이터는 남기고, 세번째 데이터는 제거하는 것이다.
Ans = df.loc[(df.item_name == 'Steak Salad') | (df.item_name == 'Bowl')]
Ans = Ans.drop_duplicates('item_name')
Ans.head()
# drop_duplicates(): 특정 열의 값이 중복되는 경우에는 첫 번째 케이스만 남기기
아래와 같이 loc를 쓰지 않아도 모두 동일한 결과를 반환한다.
Ans = df[(df.item_name == 'Steak Salad') | (df.item_name == 'Bowl')]
Ans = Ans.drop_duplicates('item_name')
Ans.head()
Python에서 데이터의 평균을 계산할 때는
mean()
메서드를 사용한다.
df.new_price.mean()
# 결과값:
# 7.464335785374297
Ans = df[df.new_price >= df.new_price.mean()]
Ans.head()
# 'item_name' 열 값이 'Izze'인 행을 선택하여 해당 행의 'item_name' 열에 접근하여 'item_name' 값을 'Fizzy Lizzy'로 수정
df.loc[df.item_name == 'Izze', 'item_name'] = 'Fizzy Lizzy'
Ans = df
Ans.head()
iloc
는 인덱스의 순서를 기반으로 행과 열을 선택하는 데 사용되며,loc
는 행 및 열의 라벨을 기반으로 데이터를 선택하는 데 사용된다.
따라서 데이터프레임에서 단일 조건을 만족하는 특정 행을 선택할 때는 iloc
나 loc
를 모두 사용할 수 있다. 하지만 행과 열에 대해 독립적으로 sorting 및 filtering을 할 때는 loc
를 사용하는 것이 좋다.
loc를 사용할 때는 행과 열을 선택하여 데이터를 가져올 수 있다. 이때 행과 열은 각각 인덱스 이름이나 라벨을 사용하여 지정한다.
loc[행,열]
# [행, 열]: 각각 해당 행과 열의 인덱스 이름이나 라벨을 의미
loc
를 사용하지 않고 데이터프레임에서 특정 조건을 만족하는 특정 열을 선택하려면 다음과 같이 사용할 수 있다.
df[df.item_name == 'Izze']['item_name']
loc
를 사용하여 데이터프레임에서 특정 조건을 만족하는 특정 열을 선택할 때는 다음과 같이 사용한다.
df.loc[df.item_name == 'Izze', 'item_name']
df.choice_description.isnull().sum()
# isnull(): 각 행이 null 값인지 여부 확인 (null 값인 경우 True 반환, 그렇지 않은 경우 False 반환)
# sum(): True 값을 1로, False 값을 0으로 간주하여 해당 열에서의 True의 개수 합산
# 결과값:
# 1246
# 데이터프레임에서 'choice_description' 열의 값이 null인 경우를 찾아서 해당 값을 'NoData'로 대체
df.loc[df.choice_description.isnull(),'choice_description'] = 'NoData'
Ans = df
Ans.head()
# 데이터프레임에서 'choice_description' 열의 값 중에 'Black'이 포함된 행들 선택
Ans = df[df.choice_description.str.contains('Black')]
Ans.head()
하나씩 검증해보는 방법은 아래와 같다.
# 데이터프레임에서 선택된 'choice_description' 열의 첫 번째 행을 리스트로 변환하여 출력
list(Ans['choice_description'])[0]
# 결과값:
# [Tomatillo-Red Chili Salsa (Hot), [Black Beans, Rice, Cheese, Sour Cream]]
# 데이터프레임에서 선택된 'choice_description' 열의 두 번째 행을 리스트로 변환하여 출력
list(Ans['choice_description'])[1]
# 결과값:
# [Tomatillo Red Chili Salsa, [Fajita Vegetables, Black Beans, Pinto Beans, Cheese, Sour Cream, Guacamole, Lettuce]]
Python에서는 Not 조건을 나타내기 위해
~
기호를 사용한다.
# 데이터프레임에서 'choice_description' 열의 값 중에서 'Vegitables'를 포함하지 않는 행의 개수 계산
Ans = len(df.loc[~df.choice_description.str.contains('Vegitables')])
Ans
# 결과값:
# 3900
# 데이터프레임에서 'item_name' 열의 값이 'N'으로 시작하는 행들 선택
Ans = df[df.item_name.str.startswith('N')]
Ans.head()
# str.startswith(): ~으로 시작하는지 여부 확인
# 데이터프레임의 'item_name' 열의 각 값에 대해 문자열의 길이 계산
df.item_name.str.len()
# str.len(): 각 값에 대해 문자열의 길이를 계산
'item_name'의 첫번째 행(인덱스 0번째)은 'Chips and Fresh Tomato Salsa'로 공백 포함 28 글자이다.
위의 명령어를 사용하면 공백도 포함하여 단어 갯수를 센다.
# 데이터프레임에서 'item_name' 열의 값 중에서 문자열 길이가 15 이상인 행들 선택
Ans = df[df.item_name.str.len() >= 15]
Ans.head()
# 데이터프레임에서 'new_price' 열의 값이 주어진 리스트(lst)에 포함된 값들을 가진 행들을 선택
lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]
Ans = df.loc[df.new_price.isin(lst)]
display(Ans.head(3))
print(len(Ans))
# isin(): 시리즈 또는 데이터프레임의 값이 주어진 리스트나 집합에 포함되는지를 검사
print(len(Ans))
명령어 불포함:
# 주어진 리스트(lst)에 포함된 값을 가진 'new_price' 열의 행들 중 상위 3개의 행 출력
lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]
Ans = df.loc[df.new_price.isin(lst)]
display(Ans.head(3))
위의 이미지에서는 테이블 하단에 숫자(예: 1393)를 나타났는데 아래 이미지에서는 해당 숫자를 찾을 수 없다.
display(Ans.head(3))
명령어 불포함:
# 주어진 리스트(lst)에 포함된 값을 가진 'new_price' 열의 행들 중의 개수 출력
lst =[1.69, 2.39, 3.39, 4.45, 9.25, 10.98, 11.75, 16.98]
Ans = df.loc[df.new_price.isin(lst)]
print(len(Ans))
# 결과값:
# 1393