[PYTHON] ✨DATAFRAME✨

Soo·2023년 10월 4일
0
post-thumbnail

EDA 테스트를 해보며 자주 나오는 코딩 문법 복습하기!!!

✏️ 데이터프레임 만들기

💡 행(row) 기준

  • 디렉토리 : 한 행 {'컬럼명' : '값'}
  • 리스트로 묶기
source =  
 [{'매장명': '용마로주유소',
  '주소': '서울 중랑구 용마산로 309 (면목동)',
  '브랜드': 'SK에너지',
  '휘발유 가격': '1,798',
  '경유 가격': '1,698',
  '셀프 여부': 'Y',
  '세차장 여부': 'Y',
  '충전소 여부': 'N',
  '경정비 여부': 'N',
  '편의점 여부': 'N',
  '24시간 운영 여부': 'N',
  '구': '중랑구'},
  {'매장명': '범아주유소',
  '주소': '서울 중랑구 동일로 881 (묵동)',
  '브랜드': 'S-OIL',
  '휘발유 가격': '1,859',
  '경유 가격': '1,739',
  '셀프 여부': 'N',
  '세차장 여부': 'Y',
  '충전소 여부': 'N',
  '경정비 여부': 'Y',
  '편의점 여부': 'N',
  '24시간 운영 여부': 'N',
  '구': '중랑구'}]
  
df=pd.DataFrame(source)

💡 Github에서 파일 불러오기

git_address="http://~~~" #따옴표 중요
df=pd.read_excel(git_address)
  • 번외 ) 리스트를 튜플로 만들기 (zip), 튜플을 딕셔너리로, 언팩킹
# 리스트를 튜플로 만들기 (zip),
list1=['a','b','c']
list2=[1,2,3]
pairs =[pair for pair in zip(list1,list2)]
paris

out>>
[('a',1),('b',2),('c',3)]

#튜플을 딕셔너리로
dict(pairs)

out>>
{'a':1,'b':2,'c':3 }

#언팩킹
x,y =zip(*pairs)
x

out>>
('a','b','c')

print(list(y))

out>>
[1,2,3]

💡 열(column) 기준

source={'country': ['a', 'b', 'c', 'e', 'e'],'person': [11, 22, 3, 23, 9],'zero': [0, 0, 0, 0, 0]}

df_temp=pd.DataFrame(source)
df_temp

'country': ['a', 'b', 'c', 'e', 'e']}

✏️ 파일 읽기

💡 csv

import pandas as pd

#파일 불러오기
data = pd.read_csv('주소/파일.csv', encoding='')

#파일 확인하기
data.head()

💡 html

import pandas as pd
pd.read_html(URL, match='.+', flavor=None, header=None, index_col=None, skiprows=None, attrs=None, parse_dates=False, tupleize_cols=None, thousands=', ', encoding=None, decimal='.', converters=None, na_values=None, keep_default_na=True, displayed_only=True)

✏️ 열(컬럼) 조회

💡 컬럼 1개

  • df[‘ColumnName’]
  • df.ColumnName

💡 컬럼 여러개

  • df[[‘ColumnName’, 'ColumnName']]
    리스트에 리스트 형식

💡 loc를 사용해서 불러오기


✏️ 행 조회

💡 인덱싱 활용 : loc, iloc

df.loc[행 인덱싱 값, 열 인덱싱 값 ]

  • Location 약자
# 예시
df.loc[0] : 0번째 행변경 (딕셔너리)
df.loc[0,'Name'] : 0번째 행, Name 열
df.loc[:,'Name'] : 전체 행, Name 열
df.loc[:4,:'Name'] : 처음행부터 4까지, 처음열부터 Name 열
df.loc[[1,2,5],['Name','Address']] : 1,2,5+ Name, Address 열

# 예시 : age 컬럼에서 3인 값들 추출하기
cond1=df['age'] == 1
df.loc[cond1]

# 예시 : age 컬럼에서 3인 값들 추출하기 + class가 30인 값 추출하기
df.loc[(df['age'] == 1) | (df['class가'] == 30)]
# 멀티 인덱스일 경우_아래 이미지
df_target.loc[('서울시', '합계', '발생건수'),열]

df.iloc[행 인덱싱값, 열 인덱싱 값]

  • Integer Location 약자
  • 맨 첫 행은 0부터 시작
  • 명칭을 직접 적거나 특정 조건식을 사용하는 loc와 달리 컴퓨터가 읽기 좋은 '숫자'형식으로 위치에 접근함
# 예시 
df.iloc[2] #0부터 시작해서 0>1>2 번째 줄
df.iloc[3:7] #0>1>2>3 번째 ~ 6번째 줄
df.iloc[:7] #처음부터 ~ 6번째 줄
df.iloc[:-7] #마지막에서부터 ~ 6번째까지

💡 iterrows()

  • 데이터의 행-열/데이터 정보를 튜플 형태의 generator 객체로 반환하는 메서드
  • (행 이름, 내용의 Series객체) 형태로 반환하는데, Series객체는 열 - 값 형태로 반환

💡 조건 활용

  • df[df['ColumnName']조건]
  • df[df.ColumnName 조건]
    데이터 프레임에 데이터 프레임
# 예시 : age 컬럼이 30 이상인 행을 가져오고 싶다면
df[df['age']>=30]
df[df.age>=30]
    
# 예시 : name이 ‘Clara Oswald’가 아닌 경우만 선택하고 싶다면
df[df['name'] != 'Clara Oswald']
df[df.name != 'Clara Oswald']

✏️ 데이터프레임 내용 수정

💡 .replace (수정 전, 수정 후)

💡 인덱스, 컬럼명_딕셔너리, 리스트

아래 코드에서 이 부분 로직 잘 확인하기 : df.loc[df.index == index, 'country'] == country

df={'country': ['a', 'b', 'c', 'e', 'e']},'person': [11, 22, 3, 23, 9]},'zero': [0, 0, 0, 0 0]}

#(인덱스,'country'컬럼 변경 내용)
df_change_list = [
    (1, 'A'),
    (3, 'C'),
    (4, 'E'),
]

for index, country in df_change_list:
    df.loc[df.index == index, 'country'] = country

💡 컬럼명_리스트

df.columns=[]

💡 컬럼명_딕셔너리

df.rename(columns={'기존 이름' : '바뀔 이름'})

💡 컬럼 순서_리스트

data={
    "name" : a,
    "age" : b,
    "height" : c,
    "sex" : d
}
혹은
df.columns = ['name', 'age', 'height', 'sex']
------------------------------------------------------------
#1
df[['name', 'sex', 'age', 'height']]

#2
df=pd.DataFrame(data, columns=["name","sex","age","height"])
df

# **3
new_order_column=['name', 'sex', 'age', 'height']
df[new_order_column]

💡 값 변경_딕셔너리

아래 코드에서 이 부분 로직 잘 확인하기 : items() / df.loc[df["Column"]==old_name, "Column"] : [행,열]

#컬럼명 주어짐
old_to_new_value = {
    'Old_1': 'New_1',
    'Old_2': 'New_2',
    'Old_3': 'New_3',}
    
for old_name, new_name in old_to_new_value.items():
    df.loc[df["Column"]==old_name, "Column"] = new_name

💡 데이터프레임 형 변환 : astype

  1. 1개 열
df1 = df.astype({'col1':'int32'})
  1. 다수 열
df1 = df.astype({'col1':'int32', 'col3':'int64'})
print(df1.dtypes)
  • 변경할 타입들이 동일 할 경우
columns_to_convert = ['col1', 'col2', 'col3']
df1[columns_to_convert] = df1[columns_to_convert].astype(float)
  1. 모든 열
df1= df.astype(dtype='int64',errors='ignore')
#errors = int64로 변경할 수 없는건 무시
print(df1.dtypes)

💡 특정 단어를 포함하고 있다면??

#특정 단어를 포함하고 있는 열을 제외한 데이터프레임으로 설정
df = df[~df['column'].str.contains('특정 단어')]

💡 split()

예시) df의 A 컬럼에서 str 타입을 공백으로 나눈다

df.컬럼명.str.split(' ')[0]

예시) df의 A 컬럼에서 str 타입을 공백으로 나눈 것에서 str타입 [0]번째 호출

df.['A'].str.split(' ').str[0]
# 같은 문법
for id, row in df.iterrows():
    df.loc[id, 'A'] = row['A'].split(' ')[0]

-----
df['A'] = df['A'].str.split(' ').str[0]
for i, row in df_practice.iterrows():
    df_practice['구분']=df_practice['구분'].str.split(' ')[i][0]

#위와 동일한 코드
df_practice['구분'] = df_practice['구분'].apply(lambda x: x.split(' ')[0])

💡 strip()

  • 문자열에서 양쪽 끝에 있는 공백이나 지정한 다른 문자들을 제거
s = "   Hello   "
print(s.strip())  # 출력: "Hello"
s = "----Hello----"
print(s.strip('-'))  # 출력: "Hello"
  • 데이터 프레임 value에서 공백 제거
df['컬럼명']=df['컬럼명'].str.strip()

✏️ 데이터 프레임 삭제하기

💡 기본 코드 : drop()

'리스트' 사용
axis=1 : 열(coulumn)

drop_col = ['A','C','F']
df=df.drop(drop_col,axis=1)

💡 특정 조건에 맞는 행 삭제

source = {'country': ['a', 'b', 'c', 'e', 'e'],
'person': [11, 3, 3, 23, 5],
'zero': [0, 0, 0, 0, 0]}

# 'country'컬럼에서 'b'인 행 지우기
idx = source[source['country'] == "b"].index
source.drop(idx , inplace=True)

# 더 심플한 방법 : 'country'컬럼에서 'b'가 아닌 행 찾기
DF = source[source.country != 'b']

💡 중복 제거 : drop_duplicates()

df.drop_duplicates()

파라미터기능
keepfirst : 첫번째만 남기고 이후 중복값 제거, default= first
last : 마지막만 남기고 이전 중복값 제거
inplacedefault = False, df 변경 여부
ignore_indexdefault = False, 인덱스 재설정 여부
subset중복 데이터를 처리할 열

💡 멀티인덱스 제거 : droplevel(level=)

df_result = df_result.droplevel(level=2)

✏️ 데이터프레임 정렬

💡 sort_values()

  1. 기본 원리 : A 컬럼을 내림차순으로
df.sort_values(by='A', ascending=False)
  1. A 컬럼을 오름차순으로 먼저 맞춘후 B 컬럼 오름차순 지정
df.sort_values(by=['A', 'B'], ascending=[True, True])
  1. 컬럼 ) 특정 리스트 순서대로
type_list = ['합계', '차대사람', '차대차', '차량단독', '건널목']
category_type = pd.CategoricalDtype(categories=type_list, ordered=True)
  1. 멀티 인덱스 ) 특정 리스트 순서대로
gu_list = ['서울시', '종로구', '중구', '용산구', '성동구]
df=df.reindex(index=gu_list, level=1)
# 두번째 인덱스 줄을 gu_list 순서대로 배열

💡 sort_index()

💡 groupby()

함수기능
count데이터의 개수
sum합계
mean평균
median중앙값
var, std분산, 표준편차
min, max최소, 최대값
unique, nunique고유값, 고유값 개수
prod
first, last첫째, 마지막값
df.groupby('컬럼명').집계함수()

#예시
df.groupby('age').var()
  • 다중 통계
df.groupby('age').agg(['mean', 'var'])

💡 List순으로 정렬하기

  • .map( ) 사용
city_list = ['서울', '부산', '대전', '광주']
cat_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
type_list = ['가', '나', '다', '라', '마', '-']

# 리스트 항목별로 순서 매기기
sorterIndex_city = dict(zip(gu_list, range(len(gu_list))))
sorterIndex_type = dict(zip(type_list, range(len(type_list))))
sorterIndex_cat = dict(zip(cat_list, range(len(cat_list))))

# 순서를 위한 임시 컬럼 만들기
df['도시순서'] = df['도시'].map(sorterIndex_city)
df['유형순서'] = df['유형'].map(sorterIndex_type)
df['구분'] = df['구분'].map(sorterIndex_cat)

#'도시순서'가 같으면 '유형순서, '유형순서'가 같으면 '구분순서'순으로 배열
df.sort_values(['도시순서','유형순서','구분순서'],inplace=)

# 임시 컬럼 삭제하기
df.drop(['도시순서','유형순서','구분순서'],axis=1,inplace=True)

✏️ 데이터 프레임 합치기

💡 .merge() : 데이터프레임 병합하기

  • 공통된 컬럼 (key) 를 기반으로 합쳐짐
* left : 왼쪽 데이터프레임 / * right : 오른쪽 데이터프레임
import pandas as pd

# 기준열 이름이 같을 때
pd.merge(left, right, on = '기준열', how = '조인방식')

# 기준열 이름이 다를 때
pd.merge(left, right, left_on = '왼쪽 열', right_on = '오른쪽 열', how = '조인방식')
  • on : (두 데이터프레임의 기준열 이름이 같을 때) 기준열
    하지만 양쪽 데이터프레임에서 기준이 되는 열의 이름이 다르다면 각각 left_on = '왼쪽 열', right_on = '오른쪽 열'로 지정하면 된다.

    • left_on : 기준열 이름이 다를 때, 왼쪽 기준열
    • right_on : 기준열 이름이 다를 때, 오른쪽 기준열
  • how : 조인 방식 {'left', 'right', 'inner', 'outer'} 기본값은 'inner'

    • left : right에 없으면 right 자리에 Nan
    • right : left에 없으면 left 자리에 Nan
    • inner : 교집합만
    • outer : 전체

💡 .concat() : 데이터 프레임 붙이기

  • 합집합 형태로 데이터를 묶을 때 편리
  • 기본 asix=0 : 행단위로 아래에 붙여넣기
    asix=1 : 열단위로 옆에 붙여넣기

✏️ 결측치 확인

💡 결측치 행 확인 : isnull()

  1. 기본 원리
    데이터 프레임에 True/False 표시 : 결측치 O = True / 결측치 X = False
df.isnull()
  1. 특정 열에서 찾기 1
    A열의 결측치
df[df['A'].isnull()]
  1. 특정 열에서 찾기 2
    A와 C 결측치_참고 : &(and), |(or)
df[(df['A'].isnull()) | (df['C'].isnull())]
  1. 결측치 개수 확인 방법
df.isnull().sum()

# 결과
A    2
B    1
C    3
dtype: int64

#특정 열에 있는지 여부 체크
df['A'].isnull().sum()

💡 결측치 아닌 행 확인 : notnull()

  1. 기본 원리
    데이터 프레임에 True/False 표시 : 결측치 O = False / 결측치 X = True
df.notnull()
  1. 특정 열에서 찾기 1
    A열의 결측치가 아닌 것을 데이터 프레임으로
df[df['A'].notnull()]
  1. 특정 열에서 찾기 2
    A와 C 결측치가 아닌 것을 데이터 프레임으로_참고 : &(and), |(or)
df[(df['A'].notnull()) | (df['C'].notnull())]
  1. 결측치가 아닌 값 개수 확인 방법
df.	notnull().sum()

# 결과
A    4
B    5
C    3
dtype: int64

💡 결측값 채우기

df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
파라미터기능
value결측값을 대체할 값, dict 형태도 가능
method결측값을 변경할 방식
bfill : 결측값 바로 아래 값과 동일하게
ffill : 결측값 바로 위값과 동일하게
axis{0 : index / 1 : columns} fillna 메서드를 적용할 레이블
inplace원본 변경 여부
limit변경활 회수, 위에서부터 지정된 갯수만 변경
downcastdowncast='infer'일 경우 float64를 int64로 변경

✏️ 인덱스 셋 & 리셋

💡 set_index()

df.set_index('id')
df.set_index(['id', 'name'])
  • 멀티 인덱스 추출하기
df.index.get_level_values(0)

💡 reset_index()

DataFrame.reset_index(level=None, drop=False,
inplace=False, col_level=0, col_fill='')

✏️ 코드 간소화하기

df=df.groupby('Country').count()
df=df.sort_values(by='Year', ascending=False)
df=df.head(10) # 상위 10개
df=df.reset_index()
dropList=['Month','Day','Region','city','latitude','longitude','Type']
df=df.drop(dropList,axis=1)
dropList = ['Month', 'Day', 'Region', 'city', 'latitude', 'longitude', 'Type']

df = (
    df.groupby('Country').count()
    .sort_values(by='Year', ascending=False)
    .head(10)
    .reset_index()
    .drop(columns=dropList)
)

✏️ 출처

[pandas] 2-1. loc와 iloc 차이와 사용방법
[pandas] 열 또는 행 선택하기
[Pandas] 파이썬 결측치 확인 방법 : isnull, notnull
[Python/파이썬] Pandas Dataframe 결합 : Merge
[Pandas] 데이터프레임 정렬하기 : sort_values, sort_index 함수
[파이썬 pandas] 데이터프레임 컬럼 순서 변경, 추가, 이름 바꾸기
[파이썬] 7. 판다스 - 특정 조건 만족하는 행 삭제하기|작성자 러닝머신
[Python] 데이터프레임 합치기 :: pd.merge()
02. 데이터 프레임 결합하기
판다스(Pandas) .groupby()로 할 수 있는 거의 모든 것! (통계량, 전처리)

profile
데린이인데요 ໒꒰ྀ ˶ • ༝ •˶ ꒱ྀིა (잘못 된 부분은 너그러이 알려주세요.)

0개의 댓글

관련 채용 정보