# 판다스 먼저 불러오기
import pandas as pd
# pd.read_excel('파일경로/파일명.확장자')
# 엑셀 불러오기
pd.read_excel('./파일명.xlsx') # ./ ==> 현재 내가 있는 위치라는 의미
# -> 만약 안되면 터미널에서 pip install openpyxl 설치
# csv 파일 불러오기
pd.read_csv('./파일명.xlsx')
df = 데이터프레임 # 저장하고 싶은 데이터
df.to_csv('./newfile.csv', index = False)
# index = False를 안하면 불러올 때 인덱스가 중복됨
데이터프레임(DataFrame) 또는 시리즈(Series)의 각 행 또는 각 요소에 대한 식별자
설정을 안하면 0부터 시작이지만, 변경하면 원하는대로 설정 가능
활용코드
# 특정 인덱스의 행에 접근
row = df.loc['idx2']
# 인덱스를 기준으로 데이터프레임 정렬
sorted_df = df.sort_index()
# df가 가지고 있는 특정 컬럼명을 기준으로 인덱스를 설정하기
data = df.set_index('컬럼명')
# 불러올때 인덱스 지정하기
pd.read_csv('./data/file.csv' , index_col = '컬럼정보')
pd.read_csv('./data/file.csv' , index_col = 0) # 0부터 시작
#인덱스 확인하기
data.index
#리스트 형태를 활용해서 인덱스를 새로 입력
data.index = ['1번' , '2번' , '3번']
# 컬럼 출력
print(df['컬럼명'])
#컬럼 확인하기
data.column
#리스트 형태를 활용해 컬럼명 새롭게 입력
data.column = ['축구', '농구', '배구', '야구']
# 컬럼 삭제
del df['컬럼명']
data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌(5 이상도 입력 가능)
data.info()
# null 값을 확인할때도 활용
data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.
# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !
# 결측치 제거 : dropna()
df.dropna()
# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])
# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])
DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)
# new_dtype : 변경하고자 하는 데이터 타입 명시 (예 : int, float, str 등)
data.iloc[0,2]
#행과 열 번호를 통해 특정 데이터를 선택할 수 있음
# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2] # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
data.loc['행이름' , '컬럼명']
# 행이름과 컬럼명을 통해서도 특정 데이터를 선택할 수 있음
# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B'] # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
참고) and = &, or = |, 줄바꿈 = \ 로 표현
불리언 인덱싱 : 조건을 이용하여 데이터프레임에서 특정 조건을 만족하는 행을 선택하는 방법
# 'age' 열에서 30세 이상인 경우의 'name' 열만 선택
df.loc[df['age'] >= 30, 'name']
# 'age' 열에서 30세 이상이면서 'gender' 열이 'Male'인 행 필터링
df[(df['age'] >= 30) & (df['gender'] == 'Male')]
# 'gender' 열에서 'Male' 또는 'Female'인 행 필터링
df[df['gender'].isin(['Male', 'Female'])] #isin도 많이 쓰니까 알아두기!
df['컬럼명'] = data
# df라는 데이터프레임에 '컬럼명'이라는 이름의 컬럼이 추가되고,해당 컬럼에 data라는 값이 추가된다.
# 리스트 형태로 컬럼값 추가하기
df['KFC'] = [50, 10, 30]
#Tip. 행 수를 맞춰서 입력해줘야함
# 컬럼을 여러 조건 및 계산식을 통해 산출 값으로도 추가가 가능
df['ABC'] = (df['EPL'] + df['NBA']) * df['MLS'] * 2
# 위아래로 데이터프레임 연결
result_vertical = pd.concat([df1, df2], axis=0)
# 좌우로 데이터프레임 연결
result_horizontal = pd.concat([df1, df2], axis=1)
# 'key' 열을 기준으로 두 데이터프레임 병합
merged_df = pd.merge(left_df, right_df, on='key', how='inner')
# 'Category' 열을 기준으로 그룹화하여 'Value'의 연산 수행
grouped_avg = df.groupby('Category').mean()
grouped_sum = df.groupby('Category').sum()
grouped_count = df.groupby('Category').count()
grouped_max = df.groupby('Category').max()
grouped_min = df.groupby('Category').min()
# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 'Value'의 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).sum()
# 'Category'와 'SubCategory' 열을 기준으로 그룹화하여 각 그룹별 'Value1'과 'Value2'의 평균, 합 계산
grouped_multiple = df.groupby(['Category', 'SubCategory']).agg({'Value1': ['mean', 'sum'], 'Value2': 'sum'})
# 피벗 테이블 생성: 날짜를 행 인덱스로, 카테고리를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values='Value', aggfunc='sum')
# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'와 'SubCategory'를 열 인덱스로, 값은 'Value'의 합으로 집계
pivot = df.pivot_table(index='Date', columns=['Category', 'SubCategory'], values='Value', aggfunc='sum')
# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균과 합으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc={'Value1': 'mean', 'Value2': 'sum'})
# 'Score' 열을 기준으로 오름차순 정렬
sorted_by_score = df.sort_values('Score')
# 'Score' 열을 기준으로 내림차순 정렬
sorted_by_score = df.sort_values('Score',ascending=False)
# 인덱스를 기준으로 오름차순 정렬
sorted_by_index = df.sort_index()
# 인덱스를 기준으로 내림차순 정렬
sorted_by_index = df.sort_index(ascending=False)
Q1. 'species' 열 값이 'setosa'인 데이터 선택하기
data = iris_data.loc[iris_data['species']=='setosa']
Q2. 10부터 20까지의 행과 1부터 3까지의 열 선택하기
data = iris_data.iloc[10:21, 1:4]
Q3. total_bill이 30 이상인 데이터만 선택하기
data = tips_data[tips_data['total_bill']>=30]
Q4. 성별('sex')을 기준으로 데이터 그룹화하여 팁(tip)의 평균 계산
# 내 풀이
avg = tips_data[['sex', 'tip']].groupby('sex').mean()
# 강의 풀이
grouped_by_sex = tips_data.groupby('sex')['tip'].mean()
Q5. 'day'와 'time'을 기준으로 데이터 그룹화하여 전체 지불 금액(total_bill)의 합 계산
sum_bill = tips_data.groupby(['day', 'time'])['total_bill'].sum()
Q6. 'day' 열을 기준으로 각 요일별로 팁(tip)의 평균을 새로운 데이터프레임으로 만든 후, 이를 기존의 tips 데이터셋에 합쳐보자
# 내 풀이
day_tip = tips_data.groupby('day')['tip'].mean()
add_tip = pd.DataFrame(day_tip)
merge_df = pd.merge(tips_data, add_tip, on='day', how='left')
# 강의 풀이
avg_tip_per_day = tips_data.groupby('day')['tip'].mean().reset_index()
avg_tip_per_day.columns = ['day', 'avg_tip']
merged_data = pd.merge(tips_data, avg_tip_per_day, on='day', how='left')