본문 바로가기
Appz Knowledge/Python

Pandas/판다스 이해 하려고...

by 스쳐가는인연 2023. 1. 29.

# Pandas # 데이터 처리를 위한 라이브러리

pandas


http://pandas.pydata.org/pandas-docs/stable/

https://www.geeksforgeeks.org/

import pandas as pd

DataFrame
pd.DataFrame() 내, dictionary 또는 list를 넣을 수 있음

df.head() # dataframe의 첫 5 행 반환 / 매개변수로 행 수를 전달할 수 있음
df.tail() # dataframe의 마지막 5 행 반환 / 매개변수로 행 수를 전달할 수 있음
df.info() # dataframe의 열에 대한 정보/속성 반환 - dataframe의 자료형 / 크기(몇 개 열과 행을 포함하는 지) 등
df.describe() # 기술통계요약
df.columns # 열 이름 반환
df.value_counts() 

df.['column_name'] # dataframe의 열에 접근
df.['column_name1', 'column_name2'] # 다수 열에 접근

df.loc['index_name'] # 특정 인덱스명의 행 반환
df.iloc[n] # n번째 행 반환
df.iloc[x:y] # x 부터 y번째 행 반환
df.iloc[:5] # df.head와 동일
df.iloc[:-5] # df.tail과 동일

df.drop('index_name', axis=0, inplace=True) # 특정 행 삭제
df.drop('index_name', axis=1, inplace=True) # 특정 열 삭제

df[(df['age'] < 30) | (df['name']=='Jones')] # 조건식을 활용하여, dataframe의 특정 조건 data만을 이용할 수 있음

Note. 전체 dataframe을 사용하지 않고, 특정 조건(?)을 통해 자료를 추출한 경우, index 정보가 순차적이지 않을 수 있음
e.g. 
df = 전체 자료 (index 0, 1, 2 ...)
df2 = 짝수 자료 (index 0, 2, 4 ...)
df3 = df2.reset_index(drop=True) # df2의 index를 다시 0,1,2 형태로 재정렬
df2.reset_index(inplace=True, drop=True) # df3을 만들지 않고, 기존 df2의 index를 0,1,2로 재정렬

# datafram의 열 이름 변경
df.columns = ['First Name', 'Age'] # list를 통해 열의 이름을 나열
df.rename(columns={'name': 'First Name', 'age': 'Age'}, inplace=True) #dictionary를 통해 열의 이름을 나열

df['column_name'] = [column_data... - 100, 150, 50, 35] # dataframe에 열 추가 / 특정 동일 값인 경우, data는 list로 전달하지 않아도 됨
df['column1'] = df['column2’] * 0.075 # 특정 열을 바탕으로 어떠한 연산 후, 새로운 열을 추가하는 방법
df['column_name'] = df['column_name'].apply(funcion() 또는 표현식) # 특정 열에 특정 함수의 기능을 적용하는 방법
df['column_name'] = df.apply(funcion() row: row['column_name']..., row['column_name']..., axis=1) # 행에 특정 함수의 기능을 적용하는 방법

# 특정 열에 대한 통계치
df.column_name.command()
command:
- mean
- std
- median
- max
- min
- count
- nunique # 고유값 개수
- unique # 고유값 list

df.groupby('column1').column2.measurement() # 집단분석
df.pivot(columns='ColumnToPivot', index='ColumnToBeRows', values='ColumnToBeValues') # 피봇테이블
e.g.) 
unpivoted = df.groupby(['column1', 'column2])['measure_target_column3'].mean().reset_index()
pivoted = unpivoted.pivot(columns='column2', index='column1', values='measure_target_column3')


# 행과 열의 축 전환하는 다른 방법
df = df.transpose()
df = df.T

# dataframe 병합
new_df = pd.merge(df1, df2)
new_df = df1.merge(df2)
big_df = df1.merge(df2).merge(df3) # 다수개 병합

# df2의 columnA_df2가 df1의 columnA_df1과 이름이 다를 때, 기준열을 지정하여 매핑되도록 병합
pd.merge(df1, df2.rename(columns={'columnA_df2': 'columnA_df1'})) 
pd.merge(df1, df2, left_on='columnA_df1', right_on='columnA_df2')
pd.merge(df1, df2, left_on='columnA_df1', right_on='columnA_df2', suffixes=['_word1', '_word2']) # 동일 목적의 열에 대해 임의의 꼬리표(suffixes)를 지정 

# 병합 시, 매칭되지 않는 행이 존재하는 경우, 
how='outer' (무조건 포함) - 누락값은 None, nan으로 표시됨
how='inner' (매칭되지 않으면 제외) 
how='left' 좌측 df에서만 포함
how='right' 우측 df에서만 포함

pd.merge(company_a, company_b, how='outer')

pd.concat([df1, df2, df2, ...]) # 동일 열이름을 갖는 여러개 df를 하나로 연결


# read csv file
df = pd.read_csv('sample.csv')

# save csv file
df.to_csv('sample.csv')


# 동일 형태의 여러 파일에서 데이터 추출 및 병합
import glob
import pandas as pd

files = glob.glob("file*.csv") # file로 시작하는 이름을 갖는 파일들

df_list = []
for filename in files:
  data = pd.read_csv(filename)
  df_list.append(data)

df = pd.concat(df_list)


pd.melt() # dataframe 자료를 기존과 다른 형태로 수정/변환하고자 할때


# 중복 행 확인 및 제거
df.duplicated() # 중복행 확인
df.duplicated().value_counts() # 중복행 개수 확인

df.drop_duplicates() # 중복행 제거
df = df.drop_duplicates(subset=['column_name']) # 일부 항목만 다른 경우, 특정 열을 기준으로 중복 제거

# 문자열 인덱싱하여 열 생성하기
Note. df에 "01131979" 형태의 생년월일 정보가 있다면, 아래 명령을 통해 월, 일, 년 정보를 새로운 열로 생성할 수 있음

df["month"]=df["birthday"].str[4:6]
df["day"]=df["birthday"].str[6:]
df["year"]=df["birthday"].str[:4]

# 문자열 나눠서 열 생성하기
Note. df에 "HyunHo LEE" 형태의 이름 정보가 있다면, 아래 명령을 통해 성, 명 정보를 새로운 열로 생성할 수 있음
name_split = df["full_name"].str.split(" ")
df["first_name"] = name_split.str.get(0)
df["last_name"] = name_split.str.get(1)

pd.to_numeric() # 특정 열의 데이터를 숫자만 남김. \100 형태로 입력되어 있다면, '\' 문자를 제거

# 문자열 파싱(정규표현식) 
Note. df에 exerciseDescription열에 "squats - 20 reps" 형태의 정보가 있다면, 아래 명령을 통해 운동명과 횟수(숫자)를 구분할 수 있음
split_df = df['exerciseDescription'].str.split('(\d+)', expand=True)
df["reps"] = pd.to_numeric(split_df[1])
df["exercise"] = split_df[2].replace('[\- ]', '', regex=True) 

# 결측치(missing value, 내용이 없는 것) 처리(데이터 전처리)
df.isnull() # 결측치 여부 확인
df.isnull().sum() #결측치 숫자 확인

df = df.dropna() # 결측치 존재 행 일괄 제거
df = df.dropna(subset=["column_name"]) # 특정 열 기준 결측치 존재 행 제거

df['column_name'] = df['column_name'].fillna(value_to_fill_in) # 특정 열의 결측치를 특정 값으로 대체



참조사이트:
<아무튼 워라벨님 블로그: https://hleecaster.com/ >
외 여럿...

 

 

 

 

 

반응형